Menu
Coddy logo textTech

Common Matrix Operations

CoddyのC#ジャーニー「ロジックとフロー」セクションの一部 — レッスン 6/66。

行列は数学やコンピュータサイエンスで一般的に使用されます。2次元配列に対するいくつかの一般的な操作について見ていきましょう。

2つの行列を加算します:

int[][] AddMatrices(int[][] a, int[][] b)
{
    int rows = a.Length;
    int[][] result = new int[rows][];
    
    for (int i = 0; i < rows; i++)
    {
        result[i] = new int[a[i].Length];
        for (int j = 0; j < a[i].Length; j++)
        {
            result[i][j] = a[i][j] + b[i][j];
        }
    }
    return result;
}

行列を転置します(行と列を入れ替えます):

int[][] Transpose(int[][] matrix)
{
    int rows = matrix.Length;
    int cols = matrix[0].Length;
    
    int[][] result = new int[cols][];
    for (int i = 0; i < cols; i++)
    {
        result[i] = new int[rows];
        for (int j = 0; j < rows; j++)
        {
            result[i][j] = matrix[j][i];
        }
    }
    return result;
}

各行の合計を計算します:

int[] RowSums(int[][] matrix)
{
    int rows = matrix.Length;
    int[] sums = new int[rows];
    
    for (int i = 0; i < rows; i++)
    {
        int sum = 0;
        for (int j = 0; j < matrix[i].Length; j++)
        {
            sum += matrix[i][j];
        }
        sums[i] = sum;
    }
    return sums;
}

2つの行列を乗算します:

行列の乗算では、各要素 result[i][j] は、最初の行列の行 i と2番目の行列の列 j を取り出し、それらの対応する要素を掛け合わせ、その積を合計することによって計算されます。形式的には、すべての有効な k の値に対して result[i][j] = sum of matrix1[i][k] * matrix2[k][j] となります。
これが機能するためには、matrix1 の列数が matrix2 の行数と等しくなければなりません。結果として得られる行列の次元は [matrix1.rows × matrix2.cols] になります。

int[][] MultiplyMatrices(int[][] a, int[][] b)
{
    int rows = a.Length;
    int cols = b[0].Length;
    int inner = b.Length;
    
    int[][] result = new int[rows][];
    for (int i = 0; i < rows; i++)
    {
        result[i] = new int[cols];
        for (int j = 0; j < cols; j++)
        {
            int sum = 0;
            for (int k = 0; k < inner; k++)
            {
                sum += a[i][k] * b[k][j];
            }
            result[i][j] = sum;
        }
    }
    return result;
}
challenge icon

チャレンジ

難しい

multiplyMatrices という名前のメソッドを作成してください。このメソッドは以下の処理を行います:

  1. 2つの行列(2次元ジャグ配列)をパラメータとして受け取ります:matrix1 と matrix2
  2. 行列の乗算の規則に従ってそれらを乗算します
  3. 結果の行列を返します

行列の乗算が有効であるためには:

  • matrix1 の列数が matrix2 の行数と等しくなければなりません
  • 結果の行列の次元は [matrix1.rows × matrix2.columns] になります

行列の乗算の仕組み:
結果の [i][j] の位置にある各要素は、matrix1 の i 行目と matrix2 の j 列目を取り出し、対応する要素同士を掛け合わせ、それらすべての積を合計することで計算されます:

result[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j] + ...

言い換えると:各 k について result[i][j] = sum of (matrix1[i][k] * matrix2[k][j]) となります。

例えば、matrix1 が以下の場合:

[1, 2]
[3, 4]

そして matrix2 が以下の場合:

[5, 6]
[7, 8]

このとき result[0][0] = 1*5 + 2*7 = 19result[0][1] = 1*6 + 2*8 = 22 のようになります。結果は以下のようになるはずです:

[19, 22]
[43, 50]

行列が乗算できない場合は、null を返してください。

自分で試してみよう

public class MultiplyMatrices
{
    // MultiplyMatrices メソッドを実装してください
    public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
    {
        // ここにコードを記述してください
        
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン