Преобразовать arma::cx_mat в массив массивов

Как мне конвертировать 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;
}

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;
}
Другие вопросы по тегам