2

大きな行列を格納/計算するために、C++ でArmadilloライブラリを使用しています。大きな配列/行列を動的に(ヒープ上に)格納する必要があることは私の理解です。

行列を宣言するとします

mat X;

サイズを (たとえば) 500 行、ランダムなエントリで 500 列に設定します。

X.randn(500,500);

アルマジロXnewor delete. 私が尋ねる理由は、Armadillo では変数を次のように宣言できるようだからです。

mat::fixed<n_rows, n_cols> 

これは、「一般に、動的メモリ割り当てよりも高速ですが、マトリックスのサイズを後で(直接的または間接的に)変更することはできません」と引用しています。

上記に関係なく、これを使用する必要があります:

mat A;
A.set_size(n-1,n-1);  

またはこれ:

mat *A = new mat;
(*A).set_size(n-1,n-1);

ここで、n は 1000 から 100000 の間で、事前にはわかりません。

4

1 に答える 1

5

アルマジロは or を使わなくても X を動的に (つまりヒープに) 保存しますnewdelete?

はい。ライブラリコードには何らかの形式のnewまたはがあります。delete外からは気づかないだけです。

私が尋ねる理由は、Armadillo では変数を ( mat::fixed...)として宣言できるようだからです。

ここで正確に何が起こっているのかを確認するには、ソース コードを調べる必要があります。私の推測では、サイズに基づいて物事を処理する方法を決定する何らかの内部ロジックがあると思います。ただし、通常はmat::fixed小さな行列に使用します。

それに続いて、使用する必要があります

mat A(n-1,n-1);

その時点ですでにサイズがわかっている場合。ある場合には、

mat A;
A.set_size(n-1,n-1);  

も大丈夫かもしれません。

mat *ポインターで2番目のオプションを使用する正当な理由は思いつきません。まず第一に、アルマジロのようなライブラリはメモリ割り当てを内部で処理し、開発者はそれを正しく行うために細心の注意を払っています。また、ライブラリ内のメモリ コードが壊れていたとしても、あなたの考えnew matでは修正できません。matオブジェクトにメモリを割り当てますが、そのオブジェクトは確かにかなり小さいものです。大部分はおそらくT* dataclassのメンバー変数のようなものの背後に隠されているためmat、これがどのように割り当てられるかを外部から制御することはできません。

のサイズに関するコメントを見逃していましたn。Mikhail が言うように、100000x100000 行列を扱うには、単純にインスタンス化する方法を考えるよりもはるかに注意が必要です。

于 2013-09-20T16:13:18.017 に答える