我的问题与此问题密切相关,但是我正在寻找Javascript解决方案
How to Transpose 2D Matrix Stored as C 1D Array
基本上我有一个二维正方形矩阵
1 2 3
4 5 6
7 8 9
存储如下
let anArray = [1 ,2, 3, 4, 5, 6, 7, 8, 9]
如何转置此矩阵,以便按以下方式切换源数组的元素?
let newArray = [1, 4, 7, 2, 5, 8, 3, 6, 9]
答案 0 :(得分:4)
您可以获取数组维度的长度,然后将项目映射到新数组的特定索引上。
var array = [1 ,2, 3, 4, 5, 6, 7, 8, 9],
n = Math.sqrt(array.length),
transposed = array.map((_, i, a) => a[(i % n) * n + Math.floor(i / n)]);
console.log(transposed.join(' '));
答案 1 :(得分:2)
您链接的答案中的方法在JavaScript中也很好用。
对于3 x 3:
const anArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let newArray = [];
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
newArray[3 * i + j] = anArray[3 * j + i];
}
}
console.log(newArray);
对于N x N,只需将3替换为N。
此答案避免了除法和下限(整数除法),并且不错的优化程序应使代码相对较快。您还可以考虑使用
初始化新数组let newArray = new Array(9);
或
let newArray = new Array(N * N);
但是在尝试诸如此类的“优化”之前先分析代码。
答案 2 :(得分:0)
var arr1 = [];
var arr2 = [];
for(int i=0; i<mat.length; i++) {
for(int j=0; j<mat[i].length; j++) {
arr1.push(mat[i][j]);
}
}
for(int j=0; j<mat[i].length; j++) {
for(int i=0; i<mat.length; i++) {
arr2.push(mat[i][j]);
}
}
答案 3 :(得分:0)
为矩阵设置最大“宽度”,然后循环插入新数组,每次运行都偏移1。
function transpose(list, width) {
if (width === void 0) {
width = 1;
}
var t = 0;
var transposed = [];
while (t < width) {
for (var index = t; index < list.length; index += width) {
transposed.push(list[index]);
}
t++;
}
return transposed;
}
//TEST
var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var transposed = transpose(list, 3);
console.log(list.join());
console.log(transposed.join());