C++仿Matlab的bsxfun函數(shù)
在Opencv中實現(xiàn)了Matlab的bsxfun函數(shù),只實現(xiàn)了加法plus、減法minus,其它的太耗時,有感興趣的朋友也來做做,分享分享。
bsxfun函數(shù)的用法參考鏈接:
https://blog.csdn.net/tina_ttl/article/details/51034773
#include <iostream> #include<string> #include<opencv2/opencv.hpp> using namespace cv; using namespace std; //bsxfun函數(shù)的說明見鏈接:https://blog.csdn.net/tina_ttl/article/details/51034773 /* 1. a,b都是單行,a、b的列數(shù)必須相同 2. a,b都是單列,a、b的行數(shù)必須相同 3. a是單行,b是單列,a的列數(shù)與b的行數(shù)可以不同。輸出為b.rows-by-a.cols矩陣。 4. a是單列,b是單行,a的行數(shù)與b的列數(shù)可以不同。輸出為b.rows-by-a.cols矩陣。 5. a是單行,b是多行多列或者單行多列,則如果a.cols==b.cols,輸出結果為b.rows-by-a.cols矩陣 6. a是單列,b是多行多列或者單列多行,則如果a.rows==b.rows,輸出結果為b.rows-by-a.cols矩陣 */ Mat bsxfun(string operation,const Mat& a,const Mat&b) { Mat temp; Mat ta,tb; /*如果b的行數(shù)、列數(shù)有一個為1, 并且a的行數(shù)或列數(shù)不等于1,二另一個尺度>1, 則ta=b,tb=a 否則,ta=a,tb=b; */ bool swapSign; if(b.rows==1||b.cols==1) { ta=b.clone(); tb=a.clone(); swapSign=1; } else { ta=a.clone();tb=b.clone();swapSign=0; } int arows=ta.rows,acols=ta.cols; int brows=tb.rows,bcols=tb.cols; int cols,rows;//a、b尺度不一致時,輸出結果的尺度 if(arows==1&&bcols==1)//3. a是行矢量,b是列矢量 { cols=acols; rows=brows; repeat(ta,rows,1,ta); repeat(tb,1,cols,tb); } else if(acols==1&&brows==1)//4. a是列矢量,b是行矢量 { cols=bcols; rows=arows; repeat(ta,1,cols,ta); repeat(tb,rows,1,tb); } else if(arows==1&&brows>1)//5. 列數(shù)必須相等 { repeat(ta,tb.rows,1,ta); } else if(acols==1&&bcols>1) { repeat(ta,1,bcols,ta); } if(swapSign) { Mat t=ta; ta=tb; tb=t; } if(operation=="plus") temp=ta+tb; if(operation=="minus") temp=ta-tb; return temp; } int main() { Mat a(5,3,CV_8U,cv::Scalar::all(1)); Mat b(1,3,CV_8U,cv::Scalar::all(3)); Mat c=bsxfun("minus",a,b); cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; cout<<c<<endl; return 0; }
運行結果如下:


浙公網(wǎng)安備 33010602011771號