0

これは私がこれまでに持っているものですが、正しいとは思いません。

for (int i = 0 ; i < 5; i++)
{
    for (int j = 0;  j < 5; j++)
    {
        matrix[i][j] += matrix[i][j] * matrix[i][j];
    }
}
4

5 に答える 5

9

提案: 宿題でない場合は、独自の線形代数ルーチンを作成しないでください。そこにある多くの査読済みライブラリのいずれかを使用してください。

さて、あなたのコードについて、用語ごとの製品を作りたいのなら、それは間違っています。あなたがしているのは、それぞれの値に二乗プラス元の値を割り当てていることです(n*n+nまたは(1+n)*n、あなたが一番好きなもの)

しかし、代数的な意味で本格的な行列の乗算を行いたい場合は、最初の行列の行と 2 番目の行列の列のスカラー積を計算する必要があることを思い出してください (または他の方法で、今はよくわかりません)。 。 何かのようなもの:

for i in rows:
    for j in cols:
        result(i,j)=m(i,:)·m(:,j)

とスカラー積 "·"

v·w = sum(v(i)*w(i)) for all i in the range of the indices.

もちろん、この方法では、次の手順で上書きする値が必要になるため、製品をその場で実行することはできません。

また、Tyler McHenry のコメントをもう少し説明すると、行を列で乗算する必要があるため、行列の「内部次元」(正しい用語かどうかはわかりません) が一致する必要があります (if Ais m x nBisn x oおよびA*Cですm x o)、したがって、あなたの場合、行列は正方形の場合にのみ2乗できます(彼は彼です)。

また、行列を少しだけ試してみたい場合は、たとえば、Octave を試すことができます。M*M行列の二乗はまたはと同じくらい簡単M**2です。

于 2009-07-22T20:00:10.910 に答える
8

行列をその場で乗算することはできないと思います。

for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
        product[i][j] = 0;
        for (k = 0; k < 5; k++) {
            product[i][j] += matrix[i][k] * matrix[k][j];
        }
    }
}

単純ではない行列乗算 (つまり、この O(n 3 ) アルゴリズム以外のもの) を使用したとしても、追加のストレージが必要です。

于 2009-07-22T20:09:24.010 に答える
6

これは、私が今まで見た行列乗算の定義ではありません。標準的な定義は

for (i = 1 to m)
   for (j = 1 to n)
      result(i, j) = 0
      for (k = 1 to s)
         result(i, j) += a(i, k) * b(k, j)

一種の疑似コードでアルゴリズムを提供します。この場合、a は amxs 行列、b は sxn で、結果は amxn で、添字は 1. で始まります。

値を使用する前に値を上書きすることになるため、その場で行列を乗算すると間違った答えが得られることに注意してください。

于 2009-07-22T20:13:22.083 に答える
0

行/列を二乗してから行/列に追加しているようです。それがあなたがしたいことですか?そうでない場合は、変更します。

于 2009-07-22T20:03:54.880 に答える
0

行列の計算を行ってから時間が経ちました (そして、その上でほんの少ししか行いませんでした) が、+=演算子は の値を取り、matrix[i][j]それに の値を追加しmatrix[i][j] * matrix[i][j]ます。やってみたいです。

于 2009-07-22T20:00:56.120 に答える