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

问题描述 投票:0回答:5

我正在尝试仅使用

n * n
中的方法创建一个Array.prototype
identity matrix
(欢迎您调用其他方法)。我可以使用
n*n
创建一个
fill()
矩阵,但是在不使用 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]
元素。

javascript arrays higher-order-functions
5个回答
3
投票

您可以使用以下函数创建一个

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 ] ]


1
投票

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

Math
函数?

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

现在我们需要一种方法来在每个位置分配一个

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

所以现在的任务是将每个

(i,j)
i - j == 0
映射到
1
i - j != 0
0

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

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

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

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);
    });
  });
}


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(或三元运算),结果将是布尔矩阵。


0
投票

我用 ES6 函数做了那个例子。

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


0
投票

function getIdentityMatrix(n) {
   let index=0;
   let arr=new Array(n).fill(0);
   arr.map(x=>{
      let tmp=new Array(n).fill(0);
      tmp[index]=1;
      arr[index++]=tmp;
      return x;
   });
   return arr;
}

© www.soinside.com 2019 - 2024. All rights reserved.