Matlab与C混合编程的三维矩阵传递

由于mexFunction与直接在C语言里编程不同,所以指针的运用很繁琐,尤其是面临着参数传入传出的问题。这里,我将matlab中生成的一个三维矩阵传到mexFunction中,然后进行传出到matlab。当然,我们可以根据自己的需要在mexFunction中进行矩阵的各种操作和计算。

一、三维矩阵维度参数的提取

int M,N,K; //定义三个维度的元素个数

cons int *dim_array;

dim_array=mxGetDimensions(prhs[0]);

#include<stdio.h>
#include"mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double *p;
    double *page;
  // mwSize dims[3];
    int i,j,k,M,N,K;
    int ii=0;
 const int *dim_array;
  int numberofdims;
  numberofdims=mxGetNumberOfDimensions(prhs[0]);
  dim_array=mxGetDimensions(prhs[0]);
   p=mxGetPr(prhs[0]);
   M=*dim_array;sanwei
   N=*(dim_array+1);
   K=*(dim_array+2);
   printf("%d %d %d \n",M,N,K);  
   //dims[3]=(M,N,K);
   plhs[0]=mxCreateNumericArray(mxGetNumberOfDimensions(prhs[0]),mxGetDimensions(prhs[0]),mxDOUBLE_CLASS,mxREAL);
   page=(double*)mxGetData(plhs[0]);
   
  for(k=0;k<K;k++)
  {
   // *page=*(page+M*N);
   for(i=0;i<M;i++)
     {
        for(j=0;j<N;j++)
        {
           page[(M*N)*k+i*N+j]=p[(M*N)*k+i*N+j];
        }
   }  
  }
  
}

M=*dim_array;

N=*( dim_array+1);

K=*( dim_array+2);

printf(“%d%d %d \n”,M,N,K); 

 

二、三维矩阵的传递

1、对于matlab常用的双精度矩阵,所以我们用mxCreateNumericArray函数来生成N维的矩阵,mxGetNumberOfDimensions(prhs[0])获取当前矩阵的维度,结果也就是3;mxGetDimensions(prhs[0])是获取矩阵的各个维度值(这一项,同样可以定义int dims[3],然后以前很多方法可以利用dim={M,N,K}我用的matlab2014b和VC2013需要把大括号换成小括号才不会报错,需要注意一下)

plhs[0]=mxCreateNumericArray(mxGetNumberOfDimensions(prhs[0]),mxGetDimensions(prhs[0]),mxDOUBLE_CLASS,mxREAL);

2、获取输出矩阵plhs[0]之后,我们就可以对其进行赋值了,这里我们定义double *page来操作:

page=(double*)mxGetData(plhs[0]);//注意这里mxGetData出来的是void *类型,需要强转。

3、三维矩阵的赋值,利用我们常见的三层循环来做,p是输入指针:

  for(k=0;k<K;k++)

  {

   for(i=0;i<M;i++)

     {

        for(j=0;j<N;j++)

        {

          page[(M*N)*k+i*N+j]=p[(M*N)*k+i*N+j];

        }

  

  }

 

最近也是刚接触这块,各位有什么好的想法和更方便的思路欢迎一起交流!

    原文作者:sorrow prince
    原文地址: https://blog.csdn.net/qq_36946546/article/details/80047718
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞