c++ - 将矩阵 c\c++ API 与基于行的索引一起使用

标签 c++ matlab matrix

在我的项目中,我在 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/

相关文章:

c++ - 需要参数的函数无需参数即可工作 (C++)

c++ - 在 Visual Studio 中调试 mex 函数

MATLAB 矢量化 : filling struct fields from vector elements

math - XZY 变换矩阵到 XYZ

c - 我应该在这段 C 代码中使用指针吗?在哪里?

Matlab特殊矩阵

c++ - 了解 FTP 服务器项目的 "create a virtual filesystem which allows mapping of arbitrary directories"

c++ - 我的分类神经网络存在逻辑问题

c++ - 如何在 C++ 中获取特定于平台的路径分隔符?

matlab - 在 Matlab 中设置元胞数组中每个矩阵的最后一个值