0

サイズ 'n' の行行列を n*n 行列で乗算する乗算式を実装する必要があります。

DenseMatrix クラスを使用して 2D 配列から n*n 行列を作成しました...しかし、私の問題は行ベクトルを作成する方法です...

CompRowMatrix クラスを使用して行マトリックスを作成できます...しかし、そのためには、入力は「マトリックス」である必要があります..しかし、マトリックスはインターフェイスです..インスタンス化できません..CompRowMatrix クラスの最初のコンストラクターは、それが必要であると述べています入力としての「インデックスのゼロ以外の配列」..しかし、このゼロ以外のインデックスの配列が何であるかを理解できません??

また、 DenseVectorまたはその他の適切なクラスを使用してベクトルを作成することもできます..しかし、ベクトルを行列で直接乗算する方法はないようです..

助けてください

4

2 に答える 2

4

このCompRowMatrixクラスは実際には行ベクトルとして使用することを意図したものではなく、行ごとに行列要素を簡単に反復処理できるような方法で疎行列を表すために使用されます。

CompRowMatrix最初の行以外のすべての行をゼロに設定することでベクトルとして使用することは可能ですが、これはプログラマーとしてより複雑であり、他の行が潜在的に非ゼロになる可能性があると想定しなければならないコードにとっては効率的ではありません。

代わりに、DenseVectorオブジェクトを使用して行ベクトルを保持し、インターフェイスからmultメソッドを使用しMatrixます。引数として2 つのオブジェクトを受け取りVector、ベクトル行列の積を生成します。このメソッドは、次の引数で乗算されている行列オブジェクトで呼び出されます。

  • 最初の引数、xは、行列で乗算するベクトルです
  • 2 番目の引数 ,yは、乗算の結果を保持します

したがって、ベクトルと行列の積y = x*A(xy1xn行ベクトルで、Anxn行列) を生成するには、次のようにします。

// create matrix A
double[][] matValues = new double[n][n];
... // initialize values of the matrix
Matrix A = new DenseMatrix(matValues);

// create vector x
double[] vecValues = new double[n];
... // initialize values of the vector
Vector x = new DenseVector(vecValues);

// create vector y to store result of multiplication
Vector y = new DenseVector(n);

// perform multiplication
A.mult(x, y);

yこれで、必要に応じてコードの残りの部分で使用できます。y乗算の前に割り当てることは重要ですが、保持するデータは関係ありません。このmultメソッドは、終了時に内容を上書きyします。

xまた、私が選択した初期化方法だけが使用可能な方法ではなかったことにも注意してくださいA。たとえば、上記のコードは、対応するandオブジェクトを作成するときに、配列vecValuesおよび を自動的にディープ コピーします。他の目的で配列を使用する予定がない場合は、おそらくこのディープ コピーを実行しないでください。これを行うには、コンストラクターで false に設定された追加のブール値パラメーターを渡します。matValuesVectorMatrix

// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);

より多くのコンストラクターオプションについては、あなたと私が以前にリンクした javadoc を参照する必要があります。ただし、javadoc は MTJ の現在のリリース (この記事の時点ではバージョン 1.01) とは異なるバージョン用であることに注意してください。それがどのバージョンに対応しているかはわかりませんし、現在のバージョンの javadoc を見つけることもできませんでしたが、現在のソース コードとの違いをいくつか見つけました。

于 2014-03-05T23:01:05.053 に答える
2

あなたの質問を理解した場合、1 つの解決策は、1 行 n 列の行列を作成して、nxn 行列を事前に乗算することです。ベクトルを乗算するためのルーチンがありますが、それらはすべて、行列を乗算した後のベクトルを持っていると思います。代わりにこれらのルーチンを使用したい場合は、適切な転置を行う必要があります。

于 2011-09-27T15:21:09.240 に答える