2016-07-21 4 views
2

배열로 배열 변환하려면 어떻게해야합니까 arma::cx_mat?arma :: cx_mat을 배열 배열

변환의 동기는 .mat 파일을 출력하기 위해 C 라이브러리 인 libmatio을 사용하는 것입니다.

은 지금까지 나는 벡터의 벡터에 arma:cx_mat 변환하는 함수를 만들었습니다

std::vector<std::vector<double>> mat_to_vv(arma::cx_mat &M) 
{ 
    std::vector<std::vector<double>> vv(M.n_rows); 
    for(size_t i=0; i<M.n_rows; ++i) 
    { 
     vv[i] = arma::conv_to<std::vector<double>>::from(M.row(i)); 
    }; 

    return vv; 
} 
+0

cx_mat는 복잡한 매트릭스이므로 어떤 유형의 C- 배열을 얻고 싶습니까? –

+0

@Atomic_alarm 좋은 질문입니다. 제곱 된 표준을 저장하고 싶습니다. 이 숫자는 실수 여야합니다. 맞습니까? 그렇지 않다면 실제 파트 만 저장하고 싶습니다. 이 질문의 목적을 위해, 당신은 double 배열 배열에 행렬의 실수 부분만을 저장하려고한다고 가정 할 수 있습니다. –

+0

예. 하지만 왜 제곱 된 규범이 필요하다면 왜 배열로 변환해야합니까? –

답변

0

이 기능을 사용할 수있는 배열 C 배열에 cx_mat에서 실수 부분을 변환해야하는 경우 :

double** mat_to_carr(arma::cx_mat &M,std::size_t &n,std::size_t &m) 
{ 
const std::size_t nrows = M.n_rows; 
const std::size_t ncols = M.n_cols; 
double **array = (double**)malloc(nrows * sizeof(double *)); 

for(std::size_t i = 0; i < nrows; i++) 
    { 
     array[i] = (double*)malloc(ncols * sizeof(double)); 
     for (std::size_t j = 0; j < ncols; ++j) 
      array[i][j] = M(i + j*ncols).real(); 
    } 

n = nrows; 
m = ncols; 

return array; 
} 

참고 더 이상 필요하지 않은 경우 배열을 해제해야합니다. 예 :

int main() 
{ 
cx_mat X(5, 5, fill::randn); 
std::size_t n,m; 
auto array = mat_to_carr(X,n,m); 
for (std::size_t i = 0; i < n; ++i) 
    { 
     for (std::size_t j = 0; j < m; ++j) 
      std::cout<<array[i][j]<<" "; 
     std::cout<<std::endl; 
    } 

for(std::size_t i = 0; i < n; i++) 
     free(array[i]); 
free(array); 
return 0; 
}