【问题标题】:How to transpose 2D square matrix stored as 1D array in Javascript如何在Javascript中转置存储为一维数组的二维方阵
【发布时间】:2018-08-13 06:52:37
【问题描述】:

我的问题与这个问题密切相关,但我正在寻找 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] 

【问题讨论】:

  • 你的矩阵有固定的行数和列数吗?
  • 我使用的矩阵大小为 3x3,但出于这个问题的目的,我假设我总是使用方阵(可能是 4x4、5x5)。我会更新问题以反映这一点。

标签: javascript arrays


【解决方案1】:

您可以获取数组维度的长度,并将项目映射到新数组的特定索引上。

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(' '));

【讨论】:

    【解决方案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);
    

    但在尝试诸如此类的“优化”之前分析代码。

    【讨论】:

      【解决方案3】:
      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]);
          }
      }
      

      【讨论】:

        【解决方案4】:

        为您的矩阵设置一个最大“宽度”并循环插入一个新数组,每次运行偏移 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());

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          • 2021-07-20
          • 2013-06-29
          • 1970-01-01
          相关资源
          最近更新 更多