2013-08-29 46 views
0

還有就是如何創建或更改C++中的數組,並在MATLAB使用它作爲一個陣列中的標準例如:建立在C++的二維陣列,並用它在MATLAB

/*========================================================== 
* arrayProduct.c - example in MATLAB External Interfaces 
* 
* Multiplies an input scalar (multiplier) 
* times a 1xN matrix (inMatrix) 
* and outputs a 1xN matrix (outMatrix) 
* 
* The calling syntax is: 
* 
*  outMatrix = arrayProduct(multiplier, inMatrix) 
* 
* This is a MEX-file for MATLAB. 
* Copyright 2007-2012 The MathWorks, Inc. 
* 
*========================================================*/ 
/* $Revision: 1.1.10.4 $ */ 

#include "mex.h" 

/* The computational routine */ 
void arrayProduct(double x, double *y, double *z, mwSize n) 
{ 
    mwSize i; 
    /* multiply each element y by x */ 
    for (i=0; i<n; i++) { 
     z[i] = x * y[i]; 
    } 
} 

/* The gateway function */ 
void mexFunction(int nlhs, mxArray *plhs[], 
        int nrhs, const mxArray *prhs[]) 
{ 
    double multiplier;    /* input scalar */ 
    double *inMatrix;    /* 1xN input matrix */ 
    size_t ncols;     /* size of matrix */ 
    double *outMatrix;    /* output matrix */ 

    /* get the value of the scalar input */ 
    multiplier = mxGetScalar(prhs[0]); 

    /* create a pointer to the real data in the input matrix */ 
    inMatrix = mxGetPr(prhs[1]); 

    /* get dimensions of the input matrix */ 
    ncols = mxGetN(prhs[1]); 

    /* create the output matrix */ 
    plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL); 

    /* get a pointer to the real data in the output matrix */ 
    outMatrix = mxGetPr(plhs[0]); 

    /* call the computational routine */ 
    arrayProduct(multiplier,inMatrix,outMatrix,(mwSize)ncols); 
} 

這是basicly什麼我正在尋找,只是想改變一個2D數組而不是一個簡單的數組。我試圖創建一個二維數組(4 * n)並更改第4行以查看它是否有效。如果我改變了下面幾行:

/* The computational routine */ 
void arrayProduct(double x, double *y, double *z, mwSize n) 
{ 
mwSize i; 
/* multiply each element y by x */ 
for (i=0; i<n; i++) { 
z[3][i] = x * y[i]; 
} 
} 

/* create the output matrix */ 
    plhs[0] = mxCreateDoubleMatrix(4,(mwSize)ncols,mxREAL); 

它不到風度的工作。我得到錯誤,z既不是字段也不是指針。任何人都可以告訴我我做錯了什麼,以及我如何得到這個工作?

+0

在Matlab中,數組索引從「1」開始,而不是從「0」開始,就像在其他語言中一樣。 –

回答

1

從根本上說,一個2維陣列總是需要被定義其第一尺寸。

將指針(z)作爲2d數組來處理該規則。

沒有第一維度(實際上,除了最後一個維度)定義,實際從指針偏移不能正確計算。

在你的代碼,因爲你知道每個維度的大小相等,就可以計算出指針偏移量自己,而不是。

1

多維數組仍然存儲爲單個連續的陣列,而不是一個二維數組c。數據是列主要的順序,這意味着z [0]是元素(1,1),z [1]是元素(2,1)等,一直到z [4 * N-1]

要計算從所希望的二維索引(行,列)(從0開始)的線性索引,只寫idx = column*nrows + row;。這意味着你需要將nrows值傳遞給你的計算函數。

所以:添加一個額外的參數,你叫nrows計算功能,並通過當你調用它該值。如上所述,索引z作爲一維數組。