MEX 文件中 Matlab 矩阵的线性索引

Posted

技术标签:

【中文标题】MEX 文件中 Matlab 矩阵的线性索引【英文标题】:Linear indexing of Matlab matrices in MEX file 【发布时间】:2016-01-20 10:24:07 【问题描述】:

我有一个如下形式的 NxN 对称矩阵 F

F_11 F_12 F_13 ... F_1N 

F_21 ...      

F_31

.
.
.

F_N1 F_N2 F_N3 ... F_NN

每个子矩阵 F_IJ 的大小为 m x m。

这个矩阵是在 MatLab 中创建的,将在 C 程序中使用。因此,这些值按列存储在向量中。 (例如,向量将采用以下形式:(F_11_11,F_11_21,F_11_31,...F_11_m1,F_21_11,...F_NN_(m-1)m,F_NN_mm)。

我的问题如下:为了便于阅读,我想在 C 中定义一种访问 F 值的方法,给定第一个子矩阵位置的索引 (I,J) 和索引 (i,j ) 子矩阵中值的位置。如何将矩阵的线性索引链接到 (I,J,i,j) 索引?

【问题讨论】:

您已标记 C++,但在问题中,您询问的是 C。您的意思是询问哪个? 我对您的命名约定感到困惑。能举个小例子吗? 描述 4 维矩阵的一种令人困惑的方式。 @user2079303 :是的,你是对的,标签应该是C。 @Daniel :是的,没错……但你会如何更好地表达它? 【参考方案1】:

我假设所有索引都是从零开始的,就像在 C/C++ 中一样。如果您想使用基于 Matlab 样式的索引,请从每个索引中减去一个。

我没查,但我猜你的索引应该是……

int idx = I*m+J*N*m*m+i+j*N*m;

【讨论】:

谢谢,这确实可以解决问题。也许将来对您如何做到这一点的解释会有所帮助(例如,在出现错误的情况下,查看错误可能在哪里) 好的,解释:你的完整矩阵 F 是 Nm x Nm。在 F 中,子矩阵 F_IJ 的元素 (i,j) 具有索引 (k,l)=(i+Im,j+Jm)。请注意,所有索引都从零开始。 F 现在保存在 N^2*m^2 长 C 数组中,这样 F 的矩阵元素 (k,l) 保存在数组索引 idx=k+lNm 处。将两个索引转换放在一起得到我提供的公式。【参考方案2】:

您可以编写一个计算索引的函数。请注意,在 C 中,索引从 0 开始。

size_t index_of_2d(size_t x, size_t y, size_t n) 
    return x + y*n;



size_t index_of_4d(size_t I, size_t J, size_t N, size_t i, size_t j, size_t m) 
    size_t submatrix = index_of_2d(I, J, N) * m * m; // scale the index in super matrix by the size of the submatrix
    return submatrix + index_of_2d(i, j, m);

【讨论】:

以上是关于MEX 文件中 Matlab 矩阵的线性索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB MEX 文件中创建双精度的 N-D 矩阵?

如何传递 matlab::data::TypedArray<double> 作为指针在 MATLAB mex 文件中构造犰狳矩阵?

Matlab Mex 文件 - 创建一个常量数组

使用 Matlab codegen 在 Matlab 2013 中创建 mex 文件时出错

mex 运行时错误:必须使用“-largeArrayDims”选项重建使用稀疏矩阵的 64 位 mex 文件

用C读取matlab的mat文件