Javascript 使用高阶函数的N*N大小的单位矩阵
我正在尝试创建一个Javascript 使用高阶函数的N*N大小的单位矩阵,javascript,arrays,higher-order-functions,Javascript,Arrays,Higher Order Functions,我正在尝试创建一个n*n标识矩阵,仅使用数组中的方法。prototype(欢迎调用其他方法)。我可以使用fill()创建n*n矩阵,但如果不使用if-else,则无法将对角元素转换为1 函数矩阵(n){ var nSizeArray=Array(n).fill().map(函数(elem){ 返回数组(elem).fill(0).indexOf([elem][elem]=1) }) 返回nSizeArray } 矩阵(5)编辑:哦,我刚刚看到您只编写了数组中的方法。原型不仅仅是函数。。。所以我
n*n
标识矩阵,仅使用数组中的方法。prototype
(欢迎调用其他方法)。我可以使用fill()
创建n*n
矩阵,但如果不使用if-else
,则无法将对角元素转换为1
函数矩阵(n){
var nSizeArray=Array(n).fill().map(函数(elem){
返回数组(elem).fill(0).indexOf([elem][elem]=1)
})
返回nSizeArray
}
矩阵(5)
编辑:哦,我刚刚看到您只编写了数组中的方法。原型不仅仅是函数。。。所以我猜你也不想包含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
中减去该结果,我们可以简单地翻转位并获得所需的结果:
函数矩阵(n){
返回数组(n).fill(0).map(函数(elem,i){
返回数组(n).fill(0).map(函数(elem2,j){
返回1-数学最小值(数学绝对值(i-j),1);
});
});
}
编辑:哦,我刚刚看到您只编写了数组中的方法。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
中减去该结果,我们可以简单地翻转位并获得所需的结果:
函数矩阵(n){
返回数组(n).fill(0).map(函数(elem,i){
返回数组(n).fill(0).map(函数(elem2,j){
返回1-数学最小值(数学绝对值(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(或三元运算),结果将是boleean矩阵。您可以尝试使用:
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(或三元运算),结果将是一个boleean矩阵。您可以使用以下函数创建一个
n*n
标识矩阵:
const-eye=n=>[…数组(n)].map((e,i,a)=>a.map(e=>+!i--);
控制台日志(眼睛(3));
// [ [ 1, 0, 0 ],
// [ 0, 1, 0 ],
//[0,0,1]
您可以使用以下函数创建一个n*n
标识矩阵:
const-eye=n=>[…数组(n)].map((e,i,a)=>a.map(e=>+!i--);
控制台日志(眼睛(3));
// [ [ 1, 0, 0 ],
// [ 0, 1, 0 ],
//[0,0,1]
我发现了一些类似的东西,但偶然发现了一些我无法解释的东西。也许你能帮忙。为什么内在地图什么都不做?德普。。。我想出来了。。。map并没有修改源数组本身,它只是返回修改后的数组。我发现了一些类似的东西,但我发现了一些我无法解释的东西。也许你能帮忙。为什么内在地图什么都不做?德普。。。我想出来了。。。map不修改源数组本身,它只返回修改后的数组。else-if绝对没有问题。else-if绝对没有问题。我觉得使用array::fill
更现代(更符合OPs原始代码)。如果您认为编辑太麻烦,请随意回滚。我觉得使用Array::fill
更现代(并且更符合OPs原始代码)。如果您认为编辑太过烦人,请随意回滚