Java Matrix Toolkit(MTJ)で行ベクトルを作成する
-
26-10-2019 - |
質問
サイズ「n」の行マトリックスにn*nマトリックスを掛けている乗算式を実装する必要があります。
Densematrixクラスを使用して、2D配列からN*Nマトリックスを作成しました...しかし、私の問題は、行ベクトルを作成する方法です...
comprowmatrixクラスを使用して行マトリックスを作成できます...しかし、そのためには、入力は「マトリックス」でなければなりません。しかし、マトリックスはインターフェイスです。 ComprowMatrixクラス 状態入力として「インデックス以外のアレイ」が必要です。しかし、私はこのゼロ以外のインデックスとは何ですか?
また、ベクトルを作成できます 濃度 または他の適切なクラス..しかし、ベクトルにマトリックスを直接掛ける方法はないようです。
plzヘルプ
解決
CompRowMatrix
クラスは実際には行ベクトルとして使用することを意図していません。むしろ、行ごとにマトリックス要素を繰り返しやすいように、スパースマトリックを表すために使用されます。
使用することは可能ですが CompRowMatrix
1番目からゼロ以外のすべての行を設定することにより、ベクトルとして、これはプログラマーとしてより複雑であり、他の行がゼロではない可能性があると仮定するコードの効率が低下します。
代わりに、aを使用します DenseVector
オブジェクトは行ベクトルを保持し、を使用します マルチ からの方法 Matrix
インターフェース。 2つを受け入れます Vector
引数としてのオブジェクトおよびベクトルマトリックス製品を生成します。この方法は、マトリックスオブジェクトで次の引数を掛けて呼ばれます。
- 第1 arg、
x
, 、あなたがあなたのマトリックスで乗算したいベクトルですか - 2番目のarg、
y
, 、乗算の結果を保持します
したがって、ベクターマトリックス製品を生産します y = x*A
(両方とも x
と y
それは 1
バツn
行ベクトルと A
です n
バツn
マトリックス)、あなたはこのようなことをします:
// 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
利用可能な方法だけではありませんでした。たとえば、上記のコードはアレイを自動的にディープコピーします vecValues
と matValues
対応するものを構築するとき Vector
と Matrix
オブジェクト。他の目的のために配列を使用するつもりがない場合は、おそらくこの深いコピーを実行しないでください。これを行うと、コンストラクターで追加のブールパラメーターセットをfalseに渡すことでこれを行います。
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
より多くのコンストラクターオプションについては、あなたと私が以前にリンクしたJavadocを参照する必要があります。ただし、Javadocは、MTJの現在のリリース(この投稿の時点のバージョン1.01)の別のバージョン用であると述べていることに注意してください。現在のバージョンのためにJavadocを見つけることができなかったバージョンがわかりませんが、それとの間にいくつかの違いを見つけました。 現在のソースコード.
他のヒント
私があなたの質問を理解している場合、1つの解決策は、NXNマトリックスを事前に行うために1つの行とn列のマトリックスを作成することです。乗算ベクターのルーチンがありますが、マトリックスを操作する後のベクトルがすべてあると思います。代わりにこれらのルーチンを使用したい場合は、適切な転置を行う必要があります。