如何提取子矩阵形成矩阵?

时间:2018-09-13 11:57:05

标签: javascript html

请考虑Matix , A=[a_i,j]。我想提取一个子矩阵,即for i,j<=4但提取A3=[a_i,j](在底部右上角的二次矩阵2x2),这是我的代码。最后,我得到“对象不支持属性或方法推”。你知道怎么了吗?

for i,j=3,4
var n = 4;
var A = [];
var arr1 = [2, 1, 3, 4];
var arr2 = [6, 4, 1, 2];
var arr3 = [5, 3, 9, 7];
var arr4 = [1, 3, 2, 1];
A.push(arr1);
A.push(arr2);
A.push(arr3);
A.push(arr4);
document.getElementById("demo1").innerHTML = A;
document.getElementById("demo2").innerHTML = A[2][2];

function a(i, j) {
  return A[i - 1][j - 1];
}
document.getElementById("demo3").innerHTML = a(3, 3);

var A3 = [];
for (i = n - 1; i < n + 1; i++) {
  for (j = n - 1; j < n + 1; j++) {
    A3 = A3.push(a(i, j));
  }
}
document.getElementById("demo4").innerHTML = A3;

4 个答案:

答案 0 :(得分:1)

您不应将A3.push()分配给A3,这就是为什么出现此错误的原因。

来自MDN:

  

[{Array.push()返回]调用该方法的对象的新length属性。

var n = 4;
var A = [];
var arr1 = [2, 1, 3, 4];
var arr2 = [6, 4, 1, 2];
var arr3 = [5, 3, 9, 7];
var arr4 = [1, 3, 2, 1];
A.push(arr1);
A.push(arr2);
A.push(arr3);
A.push(arr4);
document.getElementById("demo1").innerHTML = A;
document.getElementById("demo2").innerHTML = A[2][2];

function a(i, j) {
  return A[i - 1][j - 1];
}
document.getElementById("demo3").innerHTML = a(3, 3);

var A3 = [];
for (i = n - 1; i < n + 1; i++) {
  for (j = n - 1; j < n + 1; j++) {
    A3.push(a(i, j));
  }
}
document.getElementById("demo4").innerHTML = A3;
<p id="demo1"></p>
<p id="demo2"></p>
<p id="demo3"></p>
<p id="demo4"></p>
<p id="demo5"></p>

答案 1 :(得分:1)

您可以过滤行并映射切片的cols。

var array = [[2, 1, 3, 4], [6, 4, 1, 2], [5, 3, 9, 7], [1, 3, 2, 1]],
    pos = { i: 2, j: 2 },
    size = { i: 2, j: 2 },
    result = array
        .filter((_, i) => i >= pos.i && i < pos.i + size.i)
        .map(a => a.slice(pos.j, pos.j + size.j))

console.log(result);

答案 2 :(得分:0)

Array.prototype.push将元素添加到Array,并返回length中的Array(在添加元素之后)。

您尝试使用:

A3.push(<something>)

代替

A3 = A3.push(<something>)

答案 3 :(得分:0)

尝试这个

function getSubMatrix(matrix, startRow, startCol, length) {
    return matrix.slice(startRow, startRow + length).map(row => row.slice(startCol, startCol + length));
}