概述
对于这样一个6*3的矩阵,它是这样分配内存的:
plhs[2] = mxCreateDoubleMatrix((mwSize)6, (mwSize)3, mxREAL);
如果测试它的具体是怎么分配的:
yout = mxGetPr(plhs[2]);
会发现yout
是一个一维double指针double *
,也就是一维数组。很显然,矩阵在mexFunction内部是按照列向量的形式存储的。
对于这样一个矩阵,
A
=
[
11
12
13
21
22
23
31
32
33
41
42
43
51
52
53
61
62
63
]
A=begin{bmatrix} 11&12&13\ 21&22&23\ 31&32&33 \ 41&42&43\ 51&52&53\ 61&62&63 \ end{bmatrix}
A=⎣⎢⎢⎢⎢⎢⎢⎡112131415161122232425262132333435363⎦⎥⎥⎥⎥⎥⎥⎤
它的赋值是这样完成的:
A[0] = 11;
A[6] = 12;
A[12] = 13;
A[1] = 21;
A[7] = 22;
A[13] = 23;
A[2] = 31;
A[8] = 32;
A[14] = 33;
A[3] = 41;
A[9] = 42;
A[15] = 43;
A[4] = 51;
A[10] = 52;
A[16] = 53;
A[5] = 61;
A[11] = 62;
A[17] = 63;
C Mex程序中对矩阵的I/O
如果是想要如此一直赋值到N * 3
,二层嵌套的for循环应该这样写:
for (int k = 0; k < N; k++)
for (int m = 0; m < 3; m++) {
yout[m * N +k] = (k+1)*10+(m+1);
}
于是,可以定义这样一个按行输出矩阵的函数,它可以在CMex中调用:
void DisplayMatrix(char *Name, double *Data, int M, int N)
{ /* Display matrix data */
int m, n;
mexPrintf("%s = n", Name);
for (m = 0; m < M; m++, mexPrintf("n"))
for (n = 0; n < N; n++)
mexPrintf("%8.4f ", Data[m + M*n]);
}
调用格式为:
A = mxCreateDoubleMatrix(M, N, mxREAL); /* A is an mxArray */
DisplayMatrix("A", mxGetPr(A), M, N);
拓展内容
在Writing MATLAB C-MEX Code.pdf这本书中还说了其他数组或矩阵都是按照列向量存储的,如下图:
最后
以上就是俊秀八宝粥为你收集整理的MATLAB/C Mex函数中矩阵的是按列向量形式存储的的全部内容,希望文章能够帮你解决MATLAB/C Mex函数中矩阵的是按列向量形式存储的所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复