在我的项目中,我在 CUDA\c++
中执行了一些计算,然后我使用 Matlab 中的 Matrix API (mxCreateNumericArray
) 将我的数组作为矩阵保存到 中.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}
对于对称阵列快速转置工作。但是我的阵列不是对称的并且比较大。
最佳答案
我看到的最简单的方法是按原样使用您的代码,但在 MATLAB 中转置矩阵(基本上转置在 MATLAB 中是惰性求值的,它只是更改“ View ”)。
否则,请更改您在 C++ 中存储矩阵的方式,并以这种方式处理 (i,j)
元素,例如 mat[i + j*nrows]
您可以有效地按列优先顺序编写它。
据我所知,没有其他“直接”方法可以使用类似 mx
的函数并将 C/C++ 的行优先顺序更改为列优先顺序。
关于c++ - 将矩阵 c\c++ API 与基于行的索引一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28490797/