【问题标题】:Use matrix c\c++ API with row-based indexing使用矩阵 c\c++ API 和基于行的索引
【发布时间】:2015-02-13 00:56:34
【问题描述】:

在我的项目中,我在CUDA\c++ 中执行了一些计算,然后我使用来自 Matlab (mxCreateNumericArray) 的 Matrix API 将我的数组作为矩阵保存到 .mat 文件中。在c++ 中,我使用本地基于行的索引,但是Matlab 函数假定基于列的顺序。有没有办法快速解决这个问题?我可以将基于行的转换为基于列的,但不想这样做(以获得更高的性能)。这是一段 c++ 代码(带有 3x3 简单数组):

float data[9] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
MATFile *pmat;
const char *file = "mattest.mat";
pmat = matOpen(file, "w");
const mwSize dims[] = { 3, 3 };
mxArray *pa1 = mxCreateNumericArray(2, dims, mxSINGLE_CLASS, mxREAL);
memcpy((void *)(mxGetPr(pa1)), (void *)data, 3*3*sizeof(float));
matPutVariable(pmat, "LocalDouble", pa1);
mxDestroyArray(pa1);

所以,这里的矩阵是

 a={1 2 3
    4 5 6
    7 8 9}

它存储在数组data(行主要顺序)中。但结果,mattest.mat 文件中的矩阵是

 a={1 4 7
    2 5 8
    3 6 9}

对于对称阵列快速换位作品。但是我的阵列不是对称的并且比较大。

【问题讨论】:

    标签: c++ matlab matrix


    【解决方案1】:

    我看到的最简单的方法是按原样使用您的代码,但在 MATLAB 中转置矩阵(基本上转置它在 MATLAB 中是惰性求值的,它只是改变了“视图”)。

    否则,请更改在 C++ 中存储矩阵的方式,并像 mat[i + j*nrows] 一样寻址 (i,j) 元素,这样您就可以有效地以列优先顺序编写它。

    AFAIK,没有其他“直接”方式可以使用类似mx 的函数并从 C/C++ 的行优先顺序更改为列优先顺序。

    【讨论】:

    • 这是正确的。 +1。另一种方法(我有时会这样做)是在我的 MEX 代码中以行为主的内存中使用malloc,然后我使用列主索引复制元素,以便分配的内存成为行主。完成后,我使用行优先索引。这允许我使用为与 MATLAB 交互的行优先数组而设计的 C/C++ 代码。
    • @rayryeng 不错的技巧,可能比使用指针算法快一点
    • 谢谢,是的。我没有写我的矩阵不是正方形的。但是我刚刚发现,如果我将以行优先顺序存储的 (M1xM2) 数组写入以列优先顺序存储的 (M2xM1) 数组,我可以简单地将其转置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多