【发布时间】:2017-01-06 14:05:10
【问题描述】:
例如,假设在 Matlab 中,矩阵a(2,3,2) 如下:
a(:,:,1) =
1 2 3
4 5 6
a(:,:,2) =
7 8 9
10 11 12
如果我使用mex 并按顺序访问此矩阵的元素,我会得到以下顺序(最后是按顺序访问它们的代码):
1, 4, 2, 5, 3, 6, 7, 10, 8, 11, 9, 12
现在,如果我在 numpy 中有相同的矩阵
In [2]: np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
Out[2]:
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
,我可以尝试使用.flatten(...) 按顺序访问这些项目(找不到更好的方法——我愿意接受建议)。 flatten() 有 4 个“订购”选项:
In [4]: a.flatten('F')
Out[4]: array([ 1, 7, 4, 10, 2, 8, 5, 11, 3, 9, 6, 12])
In [5]: a.flatten('C')
Out[5]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
In [6]: a.flatten('A')
Out[6]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
In [7]: a.flatten('K')
Out[7]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
是否有一种优雅的方法可以在 Matlab 排序中访问 numpy 数组的元素? (在我的实际用例中,这些矩阵很大,所以不喜欢复制它们)
附录:顺序打印矩阵的代码
[不太好,我知道,只是为了测试]
1 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
2 {
3 // This just a test: hardcoding the size of `data_input`
4 int data_input_size = 12;
5 double *data_input;
6 const mxArray *batch_data;
7
8 // Gets a pointer to the first element of batch_data
9 data_input = mxGetPr(prhs[0]);
10
11 for(int i = 0; i < data_input_size; i++) {
12 printf("working_data[i]: %f\n", data_input[i]);
13 }
14 plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL);
15 }
【问题讨论】:
-
所以你在 numpy 中的矩阵不等于你在 MATLAB 中的矩阵。检查你的 numpy 数组的形状。
-
哦...你是对的。它是 (2, 2, 3)。