web-dev-qa-db-ja.com

アルマジロ行列をベクトルのベクトルに変換するにはどうすればよいですか?

次のようにarmadilloc ++マトリックスを作成しました。

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]; 
14
kchow462

このような場合は、 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

良いものを持っている!

13
ktalik