• C++与Matlab混合编程之:矩阵数据结构


        项目需要将matlab代码写成C++,准备用opencv。opencv中矩阵的存储与matlab有所不同,应注意以下问题:

    1、matlab中矩阵是按照列优先存储的。对于n0*n1*...*nn维的矩阵,具体存储方式是:(a0(0),a1(0),...,an(0)),(a0(1),a1(0),...an(0)), (a0(n0),a1(0),...an(0)),(a0(0),a1(1),a2(0),...an(0)),...(a0(0),a1(0),...,an(nn)).即先遍历a0,再遍历a1,a2,...,an.

    2、opencv中矩阵的存储方式是行优先的,与matlab相反。

    3、对于三维矩阵,在opencv中我常使用一个多通道的二维矩阵代替。如创建一个100*10*20的矩阵:

    Mat a(100,10,CV_32SC(20));

        也可以直接创建一个三维矩阵:

        int sz[]={100,10,20};

        Mat a(sz,CV_32S);

    4、对于遍历矩阵的操作,尽量使矩阵元素在内存中连续。我常使用下面的方法遍历矩阵:

    double *data=(double *)a.data;

    for(int i=0;i<a.rows;++i){

        for(int j=0;j<a.cols;++j){

            *(data++)=........

        }

    }

    5、矩阵的初始化

    opencv新建一个矩阵后并不会自动初始化,如果需要初始化需要自行操作。opencv提供了setTo函数:

    //初始化一个32通道的矩阵,第32通道初始化为1,其他通道初始化为0

    Mat a(100,100,CV_32SC(32));

    Vec<int,32>val;

    val=0;

    val[31]=1;

    a.setTo(val);

  • 相关阅读:
    【bzoj1029】[JSOI2007]建筑抢修
    【bzoj2748】[HAOI2012]音量调节
    【bzoj1041】[HAOI2008]圆上的整点
    【bzoj2743】[HEOI2012]采花
    【bzoj1034】[ZJOI2008]泡泡堂BNB
    【bzoj1260】[CQOI2007]涂色paint
    【bzoj2728】[HNOI2012]与非
    【bzoj2003】[Hnoi2010]Matrix 矩阵
    【bzoj1028】[JSOI2007]麻将
    利用adb截屏
  • 原文地址:https://www.cnblogs.com/goodluckcwl/p/5686118.html
Copyright © 2020-2023  润新知