javascript 利用高阶函数构造N × N单位矩阵

y0u0uwnf  于 2023-02-28  发布在  Java
关注(0)|答案(5)|浏览(120)

我尝试只使用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]元素。

tuwxkamq

tuwxkamq1#

可以使用以下函数创建**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 ] ]
ubof19bj

ubof19bj2#

编辑:哦,好吧,我刚刚看到你写了 * 只有数组中的方法。原型 * 而不仅仅是 * 只有函数 *...所以我猜你也不想包括Math函数?
map的第二个参数是元素的索引,我们将使用它来用1 s填充矩阵中的正确点。
现在我们需要一种方法,在每个位置上分配一个1,在每个位置上分配一个i == j,在每个位置上分配一个0,而不使用显而易见的if..else方法,我们可以利用i == j等价于i - j == 0这一事实。
现在的任务是将每个(i,j)Map为i - j == 01,以及i - j != 00
我们使用以下代码行来执行此操作:

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

Math.min(...)确保i - j == 0Map到0,所有其他索引组合Map到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);
    });
  });
}
gt0wga4j

gt0wga4j3#

您可以尝试:

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(或三元运算),结果将是一个博利矩阵。

jckbn6z7

jckbn6z74#

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

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

h7wcgrx35#

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

相关问题