• C++仿Matlab的bsxfun函数


    在Opencv中实现了Matlab的bsxfun函数,只实现了加法plus、减法minus,其它的太耗时,有感兴趣的朋友也来做做,分享分享。

    bsxfun函数的用法参考链接:

    https://blog.csdn.net/tina_ttl/article/details/51034773

    #include <iostream>
    #include<string>
    #include<opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
    //bsxfun函数的说明见链接:https://blog.csdn.net/tina_ttl/article/details/51034773
    /*
     1. a,b都是单行,a、b的列数必须相同
     2. a,b都是单列,a、b的行数必须相同
    
     3. a是单行,b是单列,a的列数与b的行数可以不同。输出为b.rows-by-a.cols矩阵。
     4. a是单列,b是单行,a的行数与b的列数可以不同。输出为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的行数、列数有一个为1,
          并且a的行数或列数不等于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. 列数必须相等
        {
            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;
    }

    运行结果如下:

  • 相关阅读:
    屏蔽2003:在系统启动时至少有一个服务或驱动程序产生错误
    C#中有关string和byte[]转换的问题
    如何控制winform程序只能打开一个呢?
    ArrayList的使用方法【转载】
    ASP.NET中ajaX学习记录
    C#去除字符串空格的几种方法【转载】
    C# 中2,10,16进制及其ASCII码之间转化
    vc++下char数组赋值乱码问题
    c#关机时自动退出程序
    Android入门前言(一)之Android应用开发入门五问 (转自:http://blog.csdn.net/android_tutor/)
  • 原文地址:https://www.cnblogs.com/phoenixdsg/p/14408067.html
Copyright © 2020-2023  润新知