3

JavaScript の行列乗算コードに問題があります。次の2つのマトリックスを使用して以下の関数を実行すると:

var m1 = [ [ 1, 0, 0 ],
  [ 0, 1, 0 ],
  [ 1, 1, 0 ],
  [ 0, 0, 1 ],
  [ 1, 0, 1 ],
  [ 0, 1, 1 ],
  [ 1, 1, 1 ] ];

var m2 = [ [ '0', '1', '1', '0', '0', '1', '1' ] ];

var matrixMult = function (m1, m2) {
    console.log(m1);
    console.log(m2);
    console.log("m1 length: %d, m2[0].length: %d", m1.length, m2[0].length);
    if (m1.length != m2[0].length) {
            console.error("Incompatible matrix dimensions for multiplication.");
            return false;
    }

    var result = [];

    for (var i = 0; i < m1[0].length; i++) {
            result[i] = [];
            for (var j = 0; j < m2.length; j++) {
                    var sum = 0;
                    for (var k = 0; k < m1.length; k++) {
                            sum += m1[i][k] * m2[k][j];
                    }
                    result[i][j] = sum;
            }
    }
    return result;
}

次のエラーが表示されます。

/path/to/file.js:58
                sum += m1[i][k] * m2[k][j];
                                       ^
TypeError: Cannot read property '0' of undefined
    at matrixMult (...)

何がうまくいかないのですか?問題m2.lengthは1つだけですか?

4

1 に答える 1

8

だけですm2[0]が、内側のforループはから0まで実行されます。m1.lengthこれは、よりも大きくなり0ます。したがって、アクセスしようとするm2[1]とエラーがスローされます。

また、行列乗算の定義に従うことによって

2つの行列の乗算は、左側の行列の列数が右側の行列の行数と同じである場合にのみ定義されます。

(出典:ウィキペディア

m1列が3つあるため、サンプル行列を乗算することはできませんが、m2行は1つだけです。

編集

あなたの質問を正しく理解したので、私はあなたを助けるかもしれない小さな関数を書きました:

function multiplyMatrix(m1, m2) {
    var result = [];
    for(var j = 0; j < m2.length; j++) {
        result[j] = [];
        for(var k = 0; k < m1[0].length; k++) {
            var sum = 0;
            for(var i = 0; i < m1.length; i++) {
                sum += m1[i][k] * m2[j][i];
            }
            result[j].push(sum);
        }
    }
    return result;
}

multiplyMatrix(m1, m2);

// => [ [2, 4, 2] ]
于 2013-02-13T09:48:11.257 に答える