我正在尝试仅使用
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]
元素。
您可以使用以下函数创建一个
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 ] ]
编辑:哦,好吧,我刚刚看到你只写了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);
});
});
}
你可以试试:
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(或三元运算),结果将是布尔矩阵。
我用 ES6 函数做了那个例子。
function Matrix(n) {
return [...Array(n)].map((e1, x, arr) => arr.map((e2, y) => (x === y ? 1 : 0)));
}
console.log(Matrix(5));
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;
}