1

ここに示す例に従って、MEX ファイルにスパース行列を作成しました。MATLAB 全体からこの行列にアクセスするにはどうすればよいでしょうか。

#define NZMAX 4
#define ROWS  4
#define COLS  2

int            rows=ROWS, cols=COLS;
mxArray       *ptr_array; /* Pointer to created sparse array. */
static double  static_pr_data[NZMAX] = {5.8, 6.2, 5.9, 6.1};
static int     static_ir_data[NZMAX] = {0, 2, 1, 3};
static int     static_jc_data[COLS+1] = {0, 2, 4};
double        *start_of_pr;
int           *start_of_ir, *start_of_jc;
mxArray       *array_ptr;

/* Create a sparse array. */    
array_ptr = mxCreateSparse(rows, cols, NZMAX, mxREAL); 

/* Place pr data into the newly created sparse array. */ 
start_of_pr = (double *)mxGetPr(array_ptr); 
memcpy(start_of_pr, static_pr_data, NZMAX*sizeof(double));

/* Place ir data into the newly created sparse array. */ 
start_of_ir = (int *)mxGetIr(array_ptr); 
memcpy(start_of_ir, static_ir_data, NZMAX*sizeof(int));

/* Place jc data into the newly created sparse array. */ 
start_of_jc = (int *)mxGetJc(array_ptr); 
memcpy(start_of_jc, static_jc_data, NZMAX*sizeof(int));

/* ... Use the sparse array in some fashion. */
/* When finished with the mxArray, deallocate it. */
mxDestroyArray(array_ptr);

また、値を に格納する際にstatic_pr_data、値を列メジャー形式で格納する必要がありますかic_data? jc_data行の主要な形式で保存することは可能ですか (計算が高速化されるため)?

4

2 に答える 2

1

リンク先の例では、最後のステートメントは

mxDestroyArray(array_ptr);

配列を破棄する代わりに、MEX 関数の出力として返す必要があります。MEX 関数 C/C++ ソース コードには、次のmexFunctionような名前の関数 (MEX 関数のエントリ ポイント) が必要です。

void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])

MEX 関数から出力を返すにはplhs、次のように配列に割り当てます。

plhs[0] = array_ptr; // instead of mxDestroyArray(array_ptr);

コードを MEX 関数にコンパイルします (これを と呼びましょうsparsetest)。次のように MATLAB から呼び出します。

>> output = sparsetest;

outputこれで、MEX 関数で作成したスパース行列を含む MATLAB 変数になりました。

データを行優先形式で格納することはできません。MATLAB は、列優先のスパース行列のみを処理します。

于 2011-05-28T23:41:03.750 に答える
0

を使用して matlab 構造体から行列フィールドを取得するためのヒントengGetVariable()

マトリックスであるフィールドを持つ構造体があります。C++ では、対応する構造は double** です。engGetVariable(engine,MyStruct.theField) でフィールドにアクセスしようとすると失敗します。temp 変数を使用して MyStruct.theField を格納し、次に engGetVariable(engine, tempVar) を使用します。構造体からマトリックス フィールドを取得するコードは次のようになります。

// Fetch struct field using a temp variable
std::string tempName = std::string(field_name) + "_temp";
std::string fetchField = tempName + " = " + std::string(struct_name) 
        + "." + std::string(field_name) + "; ";
matlabExecute(ep, fetchField);
mxArray *matlabArray = engGetVariable(ep, tempName.c_str());

// Get variable elements
const int count = mxGetNumberOfElements(matlabArray);
T *data = (T*) mxGetData(matlabArray);
for (int i = 0; i < count; i++)
    vector[i] = _isnan(data[i]) ? (T) (int) -9999 : (T) data[i];

// Clear temp variable
std::string clearTempVar = "clear " + tempName + "; ";
matlabExecute(ep, clearTempVar);

// Destroy mx object
mxDestroyArray(matlabArray);
于 2014-11-13T08:24:22.347 に答える