4

Armadillo マトリックス ライブラリを使用して、2 次元マトリックスの列にアクセスする効率的な方法は、単に .col(i) を呼び出すことだと認識しています。

最初にスライスコマンドを呼び出さずに、「キューブ」に格納された列を抽出する効率的な方法があるのだろうか?

たとえば、(matlab 表記を使用して) A(:,i,j) に格納されているデータにアクセスする最も効率的な方法が必要です。非常に大きなデータセットでこれを何百万回も行うため、速度と効率が最優先事項です。

4

2 に答える 2

5

私はあなたが欲しいと思います

 B = A.subcube( span:all, span(i), span(j) );

または同等に

 B = A.subcube( span(),  span(i),  span(j) );

ここBで、はと同じタイプの行または列ベクトルになりますA(たとえばdouble、デフォルトで含まれている、または他の使用可能なタイプの数)。

于 2012-04-22T18:06:18.640 に答える
1

.slice()はかなり速いはずです。基礎となるMatクラスへの参照を提供するだけです。あなたはこれらの線に沿って何かを試すことができます:

cube C(4,3,2);
double* mem = C.slice(1).colptr(2);

また、Armadilloではデフォルトで範囲チェックが有効になっていることに注意してください。範囲チェックを回避したい場合は、.at()要素アクセサーを使用します。

cube C(4,3,2);
C.at(3,2,1) = 456;

または、行列をフィールドクラスに格納することもできます。

field<mat> F(100);
F(0).ones(12,34);

対応する要素へのアクセス:

F(0)(1,2);      // with range checks
F.at(0).at(1,2); // without range checks

ARMA_NO_DEBUGを定義してコードをコンパイルすることもできます。これにより、実行時のデバッグ(範囲チェックなど)がすべて削除されます。これによりスピードアップが得られますが、すべてのコードをデバッグした後(つまり、アルゴリズムが正しく機能していることを確認した後)にのみお勧めします。デバッグチェックは、間違いを見つけるのに非常に役立ちます。

于 2012-05-18T05:17:31.933 に答える