如何将armadillo矩阵转换为向量的向量?

16

我按照以下方式创建了一个armadillo c++矩阵:

arma::mat A; 
A.zeros(3,4);

我想将其转换为由向量组成的向量定义为

std::vector< std::vector<double> > B(3, std::vector<double>(4) ); 

如何使B等于A?如果对于一个向量的向量没有简单的方法,那么对于数组的数组呢?例如,如果我定义B为

double B[3][4]; 
1个回答

16
在这种情况下,您应该使用 arma::conv_to,它是arma的一个非常出色的功能。
请注意,该方法将要求源对象能够被解释为向量。这就是为什么我们需要对每一行进行迭代转换的原因。以下是一个转换方法:
#include <armadillo>

typedef std::vector<double> stdvec;
typedef std::vector< std::vector<double> > stdvecvec;

stdvecvec mat_to_std_vec(arma::mat &A) {
    stdvecvec V(A.n_rows);
    for (size_t i = 0; i < A.n_rows; ++i) {
        V[i] = arma::conv_to< stdvec >::from(A.row(i));
    };
    return V;
}

这里是一个使用示例:

#include <iomanip>
#include <iostream>

int main(int argc, char **argv) {
    arma::mat A = arma::randu<arma::mat>(5, 5);
    std::cout << A << std::endl;

    stdvecvec V = mat_to_std_vec(A);
    for (size_t i = 0; i < V.size(); ++i) {
        for (size_t j = 0; j < V[i].size(); ++j) {
            std::cout << "   "
                << std::fixed << std::setprecision(4) << V[i][j];
        }
        std::cout << std::endl;
    }
    return 0;
}

std::setprecision用于生成更易读的输出:

0.8402   0.1976   0.4774   0.9162   0.0163
0.3944   0.3352   0.6289   0.6357   0.2429
0.7831   0.7682   0.3648   0.7173   0.1372
0.7984   0.2778   0.5134   0.1416   0.8042
0.9116   0.5540   0.9522   0.6070   0.1567

0.8402   0.1976   0.4774   0.9162   0.0163
0.3944   0.3352   0.6289   0.6357   0.2429
0.7831   0.7682   0.3648   0.7173   0.1372
0.7984   0.2778   0.5134   0.1416   0.8042
0.9116   0.5540   0.9522   0.6070   0.1567

祝你一切顺利!


3
为了避免不必要的复制,将函数声明从'mat_to_std_vec(arma::mat A)' 更改为 'mat_to_std_vec(const arma::mat& A)'。在这种情况下,&字符表示对A进行引用,而不是复制A。 - mtall
谢谢。这太棒了。 - Bluegreen17
@mtall:没错,这很重要。已经编辑了代码。 - Konrad Talik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接