16

私はアルマジロを使用するのが初めてで、かなりの試行/検索にもかかわらず、次のものを取得できませんでした。

相関を実行する必要がある 2 つの巨大な (動的) 配列 (ベクトルではない) があります。これにはアルマジロを使うことにしました。ベクトルを使用して arma::mat を初期化する方法は理解していますが、配列を使用して初期化することはできますか? ドキュメントに言及がないので、わかりません。内部設計上の理由から、ベクターの使用を避けようとしています。サンプル配列を使用して各要素を手動で初期化しようとしました(愚かですが出発点として)。次のコードのようなものは機能しません。

using namespace std;
using namespace arma;   

mat A(SIZE, 1), B(SIZE, 1);

for(int i = 0; i < SIZE; i++)
{
    A << v[i] << endr;
    B << c[i] << endr;
}

cout << "A: " << endl;
A.print();
cout << "B: " << endl;
B.print();

入力配列 v = {1, 2, 0, -1, .9} および c = {0, .5, 1, -2, -5} の場合。出力は次のようになります。

A:
        0
B:
  -5.0000

これは理解できます。配列を使用して arma::mat または arma::colvector を初期化するための回避策はありますか? 前もって感謝します!

4

1 に答える 1

10

配列 v と c が double 配列であると仮定すると、補助メモリ コンストラクターを使用できます。

アルマジロのドキュメントから:

  • mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true)

    書き込み可能な補助メモリのデータを使用して行列を作成します。デフォルトでは、マトリックスは独自のメモリを割り当て、補助メモリからデータをコピーします (安全のため)。ただし、copy_aux_mem が false に設定されている場合、マトリックスは代わりに補助メモリを直接使用します (つまり、コピーしません)。これは高速ですが、自分が何をしているのかを理解していないと危険です!

厳密な変数は、copy_aux_mem が false に設定されている場合 (つまり、行列が補助メモリを直接使用している場合) にのみ有効になります。strict が true に設定されている場合、行列はその存続期間中補助メモリにバインドされます。行列の要素数は (直接的または間接的に) 変更できません。strict が false に設定されている場合、行列は有効期間中補助メモリにバインドされません。つまり、行列のサイズを変更できます。要求された要素数が補助メモリのサイズと異なる場合、新しいメモリが割り当てられ、補助メモリは使用されなくなります。

  • mat(const aux_mem*, n_rows, n_cols)

読み取り専用の補助メモリからデータをコピーして行列を作成します。

つまり、次のようにソース データをコピーして、マトリックスを作成できます。

mat A_Copy(v, SIZE, 1);
mat B_Copy(c, SIZE, 1);

または、配列に既に割り当てたメモリを実際に再利用して、次のように読み取り専用の行列を作成することもできます。

mat A_InPlace(v, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true);
mat B_InPlace(c, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true);

ベクトルを使用すると、これはさらに簡単になります

vec A_Vec_Copy(v, SIZE);
vec B_Vec_Copy(c, SIZE);

または:

vec A_Vec_InPlace(v, SIZE, false, true);
vec B_Vec_InPlace(c, SIZE, false, true);
于 2013-10-15T03:45:47.293 に答える