C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で2つの行列を乗算するプログラムの書き方を解説

行列の乗算とは、2つの行列を掛け合わせる演算のことです。この計算が成り立つのは、1つ目の行列の列数と2つ目の行列の行数が一致している場合のみです。条件を満たしていない場合、行列同士を乗算することはできません。

本記事では、C#で行列の乗算を行うサンプルプログラムを紹介し、その処理の流れをステップごとにわかりやすく解説します。

C#での行列乗算サンプルコード

using System;

namespace MatrixMultiplicationDemo {
   class Example {
      static void Main(string[] args) {
         int m = 2, n = 3, p = 3, q = 3, i, j;
         int[] a = { { 1, 4, 2 }, { 2, 5, 1 } };
         int[] b = { { 3, 4, 2 }, { 3, 5, 7 }, { 1, 2, 1 } };

         // 行列aの表示
         Console.WriteLine("行列a:");
         for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
               Console.Write(a[i, j] + " ");
            }
            Console.WriteLine();
         }

         // 行列bの表示
         Console.WriteLine("行列b:");
         for (i = 0; i < p; i++) {
            for (j = 0; j < q; j++) {
               Console.Write(b[i, j] + " ");
            }
            Console.WriteLine();
         }

         // 乗算できるかどうかの判定
         if (n != p) {
            Console.WriteLine("行列の乗算はできません");
         } else {
            // 行列aとbの積(行列c)を計算
            int[] c = new int[m, q];
            for (i = 0; i < m; i++) {
               for (j = 0; j < q; j++) {
                  c[i, j] = 0;
                  for (int k = 0; k < n; k++) {
                     c[i, j] += a[i, k] * b[k, j];
                  }
               }
            }

            // 結果の表示
            Console.WriteLine("2つの行列の積:");
            for (i = 0; i < m; i++) {
               for (j = 0; j < q; j++) {
                  Console.Write(c[i, j] + "\t");
               }
               Console.WriteLine();
            }
         }
      }
   }
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

行列a:
1 4 2
2 5 1
行列b:
3 4 2
3 5 7
1 2 1
2つの行列の積:
17	28	32
22	35	40

プログラムの解説

① 行列aとbの表示

最初に、2つの行列aとbをコンソールに表示します。二重のforループを使い、行方向と列方向に沿って各要素を順番に出力していきます。

Console.WriteLine("行列a:");
for (i = 0; i < m; i++) {
   for (j = 0; j < n; j++) {
      Console.Write(a[i, j] + " ");
   }
   Console.WriteLine();
}

② 乗算が可能かどうかの判定

1つ目の行列の列数(n)と2つ目の行列の行数(p)が一致しない場合、行列の乗算は数学的に定義されないため、その旨をメッセージとして表示します。

if (n != p) {
   Console.WriteLine("行列の乗算はできません");
}

③ 行列の積の計算と結果表示

条件を満たしている場合は、三重のforループを使って行列aとbの積である行列cを求めます。外側の2つのループで結果となる行列cの各要素(i, j)を走査し、内側のループで「aのi行目」と「bのj列目」の対応する要素同士の積をすべて足し合わせています。これは、行列の積の定義式 c[i][j] = Σ a[i][k] × b[k][j] をそのままコード化したものです。

計算が完了したら、結果の行列cをタブ区切りで整形して表示します。

int[] c = new int[m, q];
for (i = 0; i < m; i++) {
   for (j = 0; j < q; j++) {
      c[i, j] = 0;
      for (int k = 0; k < n; k++) {
         c[i, j] += a[i, k] * b[k, j];
      }
   }
}
Console.WriteLine("2つの行列の積:");
for (i = 0; i < m; i++) {
   for (j = 0; j < q; j++) {
      Console.Write(c[i, j] + "\t");
   }
   Console.WriteLine();
}

まとめ

  • 行列の乗算が成立する条件は、「1つ目の行列の列数=2つ目の行列の行数」であること。
  • 結果の行列のサイズは「m × q」(1つ目の行列の行数 × 2つ目の行列の列数)になります。
  • 計算には三重のforループを使用し、計算量は O(m × n × q) となります。
  1. C言語のポインタを使って2つの行列を乗算する方法をわかりやすく解説

    ポインタ(pointer)とは、別の変数のメモリアドレスを格納するための変数です。C言語ではポインタを使うことでメモリを直接操作でき、効率的で高速なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる。 メモリ上の位置へ直接アクセスするため、実行速度が速い。 メモリの動的な割り当てと解放が可能になり、メモリを効率的に利用できる。 リンクリストや木構造などのデータ構造と組み合わせて使用される。 ポインタの宣言・初期化・アクセス まず、次のような通常の変数宣言を考えてみましょう。 int qty = 179; この変数はメモリ上では、「qty」という名前、値「179」、そして固有

  2. PythonとTensorFlowで2つの行列を乗算する方法を解説

    TensorFlowは、Googleが提供する機械学習フレームワークです。オープンソースとして公開されており、Pythonと組み合わせてアルゴリズムやディープラーニングアプリケーションなどを実装するために利用されています。研究用途から本番運用まで幅広く使われており、複雑な数学的演算を高速に処理できる最適化技術を備えているのが特長です。 その理由の一つは、NumPyと多次元配列を基盤としている点にあります。この多次元配列は「テンソル」と呼ばれます。TensorFlowは深層ニューラルネットワークの構築をサポートし、高いスケーラビリティを持ち、人気のデータセットが多数付属しています。また、GPUに