使用高阶函数的 N*N 大小的单位矩阵

N*N sized Identity Matrix using Higher Order Functions

我正在尝试仅使用 Array.prototype 中的方法创建一个 n * n 单位矩阵 (欢迎您调用其他方法)。我可以使用 fill() 创建一个 n*n 矩阵,但在不使用 if-else 的情况下将对角线元素转换为 1 时遇到问题。

function matrix(n) {
  var nSizeArray = Array(n).fill().map(function(elem) {
    return Array(elem).fill(0).indexOf([elem][elem]=1)
  })
  return nSizeArray
}
matrix(5)

以上只是我想做的一些示范。我不知道如何继续填充数组并使用可用的数组方法访问数组中的 [i][i] 元素。

编辑:哦,好吧,我刚刚看到你只写了 Array.prototype 中的方法,而不仅仅是 函数 ...所以我猜你也不想包含 Math 函数?

map 的第二个参数是元素的索引,我们将使用它来用 1s 填充矩阵中的正确位置。

现在我们需要一种方法来在每个位置分配一个 1,在每个位置分配一个 i == j,在每个其他位置分配一个 0,而不使用明显的 if..else 方法。我们可以利用 i == j 等价于 i - j == 0 的事实。

所以现在的任务是将每个 (i,j) 映射到 i - j == 01i - j != 00

我们使用这条线来做到这一点:

return 1 - Math.min(Math.abs(i-j),1);

Math.min(...) 确保 i - j == 0 映射到 0,所有其他索引组合都映射到 1(因为它们导致 |i-j| >= 1) .通过从 1 中减去这个结果,我们可以简单地翻转 并得到我们想要的结果:

function matrix(n) {
  return Array(n).fill(0).map(function(elem, i) {
    return Array(n).fill(0).map(function(elem2, j) {
      return 1 - Math.min(Math.abs(i-j),1);
    });
  });
}

你可以试试:

function matrix(n) {
    return Array(n).fill(Array(n).fill())
    .map(function (xs, i) {
        return xs.map(function (x, j) {
            return i === j ? 1 : 0;
        })
    });
}
matrix(5)

如果不使用 if else(或三元运算),结果将是布尔矩阵。

您可以使用以下函数创建 n * n 单位矩阵:

const eye = n => [...Array(n)].map((e, i, a) => a.map(e => +!i--));

console.log(eye(3));

// [ [ 1, 0, 0 ],
//   [ 0, 1, 0 ],
//   [ 0, 0, 1 ] ]

我用 ES6 函数完成了那个例子。

function Matrix(n) {
  return [...Array(n)].map((e1, x, arr) => arr.map((e2, y) => (x === y ? 1 : 0)));
}
console.log(Matrix(5));