将 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 转换为数组数组的主要内容,如果未能解决你的问题,请参考以下文章

js字符串每个数组前面数字转换为多少个数组

将二维 JavaScript 数组转换为一维数组 [重复]

使用 ramda 将数组数组转换为数组对象

如何将带有数组的对象转换为数组

将数组列表转换为数组数组

将多维数组转换为一维数组的算法