2012-08-24 81 views
0

我的C++代碼有問題。我想從我的cpp程序返回一個k維的矩陣到Matlab。用C++和mex輸出一個矩陣

我想通過的矩陣存儲在all_data中,並且是大小爲(npoints+1) x ndims的矩陣。

我一直在尋找如何做到這一點,我想出了:

//send back points 
    vector< vector <double> > indexes = mxGetPr(plhs[0]); 
    for (int i=0; i < (npoints1+1); i++) 
      for (int j=0; j < ndims1; j++) 
       indexes[ i ][ j ] = all_data[ i ][ j ]; 

但它不工作,因爲all_datavector<vector<double>>變量,MATLAB說:

error: conversion from 'double*' to non-scalar type 
'std::vector<std::vector<double, std::allocator<double> >, 
std::allocator<std::vector<double, 
std::allocator<double> > > >' requested 

有人可以幫我嗎?非常感謝!

回答

0

它看起來像mxGetPr返回給你一個指向一個雙精度數組的指針,並且你將它分配給一個矢量矢量。

這應該工作:

double* indexes = mxGetPr(plhs[0]); 
4

mxGetPr不返回vector<vector<double> >。它返回一個double *。 MATLAB數組連續存儲在內存中,列主要。假設你已經創建plhs [0]與正確的尺寸,那麼所有你需要做的是這樣的:

double *indexes = mxGetPr(plhs[0]); 
for (int i=0; i < (npoints1+1); i++) 
    for (int j=0; j < ndims1; j++) 
     indexes[i + ndims1*j] = all_data[ i ][ j ]; 

注2個指數的線性偏移量的轉換。

+0

你確定索引[i + ndims1 * j]?我會做我*(npoints1 + 1)+ j。但我可能是錯的。 – ablm

+2

在正常的C中,是的,你是對的。但是,MATLAB中,數組存儲的是我們所期望的。所以x(2,6)就在x(3,6)的旁邊。這就是「專欄」的含義。這是來自FORTRAN日子的剩餘物。 – Peter

+0

wooow ...真的嗎?感謝您的解釋! – ablm