使用高阶函数的N * N大小的标识矩阵

问题描述:

我正在尝试使用Array.prototype(欢迎您致电其他方法)中的方法创建n * n标识矩阵。我可以使用fill()创建一个n*n矩阵,但无法在不使用if-else的情况下将对角线元素转换为。使用高阶函数的N * N大小的标识矩阵

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]

+0

else-if绝对没有错。 – Bergi

编辑:哦,我刚才看到你写只在Array.prototype方法不只是只是起到了 ...所以我猜你不想包括Math功能要么?

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

现在,我们需要一种方法来分配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); 
 
    }); 
 
    }); 
 
}

+0

我在类似的东西上摸索了一些我无法解释的东西。也许你可以帮忙。为什么内在的地图不做任何事情? https://jsfiddle.net/4e7nh6vz/1/ –

+2

derp ...算了一下...... map不修改源数组本身,它只是返回修改后的一个 –

你可以尝试使用:

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) 

如果你不这样做如果使用else(或三元操作),结果将是一个boleean矩阵。

+0

我觉得使用'Array :: fill'是更现代化(更符合OP的原始代码)。如果您认为这太侵入,请随时回滚编辑 – Bergi