7

行列を操作するために mex を使用して MATLAB の外部 C++ 関数をインデックス作成しようとしていますが、多次元インデックスを使用できません。ここに例が示されていますが、以下で説明する問題を解決する方法が見つかりません。サンプルマトリックスがあります:

>> mat
mat =
 1    10
 2    20
 3    30
 4    40
 5    50

現在、機能するマトリックスを介して線形インデックスを使用しています。

#include <mex.h>
#include <iostream>
using namespace std;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
 //1.get pointer to input graph_list and allocate it    
    double *graph_list = mxGetPr(prhs[0]);
    mwSize mrows = mxGetM(prhs[0]);
    mwSize ncols = mxGetN(prhs[0]);  
    cout<< mrows<<" rows\n";
    cout<< ncols<<" cols\n";
    int mm, nn;
    for (nn=0;nn<ncols;nn++) {
        for (mm=0;mm<mrows;mm++){
            cout << graph_list[nn*(mrows) +mm]  <<"\n";            
        }
    }     
}

これにより、次が生成されます。

>> mexTryAlex(mat)    
5 rows
2 cols
1
2
3
4
5
10
20
30
40
50

graph_list の定義を変更し、graph_list に 2D インデックスを作成しようとすると、次のようなコンパイル エラーが発生しmexます。

double **graph_list = mxGetPr(prhs[0]);
cout << graph_list[nn][mm];

編集:ここに受け取ったエラーメッセージがあります

>> mex mexTryAlex.cpp
Warning: You are using gcc version "4.4.3-4ubuntu5)".  The version
     currently supported with MEX is "4.3.4".
     For a list of currently supported compilers see: 
     http://www.mathworks.com/support/compilers/current_release/
mexTryAlex.cpp: In function ‘void mexFunction(int, mxArray**, int, const mxArray**)’:
mexTryAlex.cpp:16: error: cannot convert ‘double*’ to ‘double**’ in initialization
mex: compile of ' "mexTryAlex.cpp"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
4

3 に答える 3

7

マトリックス クラスを使用することは、この種の問題に対処する最も簡単な方法です。選択肢はたくさんあるので、わざわざ自分で書く必要はありません。Armadillo はかなり優れており、LAPACK を使用すると LAPACK とも統合されます。 http://arma.sourceforge.net/docs.html

以下の例を参照してください

#include <mex.h>
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;

//creates an armadillo matrix from a matlab matrix
mat armaMatrix(const mxArray *matlabMatrix[]){
    mwSize mrows = mxGetM(matlabMatrix[0]);
    mwSize ncols = mxGetN(matlabMatrix[0]);
    double *values = mxGetPr(matlabMatrix[0]);

    return mat(values, nrows, ncols);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{
    mat graph_list = armaMatrix(prhs);

    //print the matrix
    cout << graph_list<<"\n";
    //print the first column
    cout << graph_list(span::all,0) <<"\n";
}
于 2013-08-10T10:34:24.983 に答える
2

Rodyが指摘したように、 1D配列へのポインターをmxGetPr返します。したがって、 C++ では2D配列として扱うことはできません。 できることは、関数を使用してND添え字を単一の 1D インデックスに変換することです。
mxCalcSingleSubscript

于 2013-04-22T12:10:14.563 に答える