将 arma::cx_mat 转换为数组数组
Posted
技术标签:
【中文标题】将 arma::cx_mat 转换为数组数组【英文标题】:Convert arma::cx_mat to array of arrays 【发布时间】:2016-07-21 22:42:24 【问题描述】:如何将arma::cx_mat
转换为数组数组?
转换的动机是使用libmatio
,这是一个C库,输出一个.mat文件。
到目前为止,我已经创建了一个将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;
【问题讨论】:
cx_mat 是复数矩阵,你想得到什么类型的 C 数组? @Atomic_alarm 好问题,我想保存平方范数。这应该是一个实数吧?如果没有,那么我只想保存真实的部分。出于这个问题的目的,您可以假设我只想将矩阵的实部保存在双数组数组中。 是的。但是,如果您需要平方范数,那么为什么需要转换为数组呢? 【参考方案1】:如果您需要将 cx_mat 中的实部转换为 C 数组数组,可以使用此函数:
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;
【讨论】:
以上是关于将 arma::cx_mat 转换为数组数组的主要内容,如果未能解决你的问题,请参考以下文章