MATLAB/C Mex函数中矩阵的是按列向量形式存储的

对于这样一个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这本书中还说了其他数组或矩阵都是按照列向量存储的,如下图:
在这里插入图片描述

复数矩阵

在这里插入图片描述
高维矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值