【问题标题】:Howto transpose multidimensional array in place如何就地转置多维数组
【发布时间】:2011-02-10 11:09:32
【问题描述】:

如何原地转置二维矩阵?

【问题讨论】:

  • 正方形与否?它有很大的不同
  • @aaa: 原地转置非方阵没有多大意义。
  • 虽然取决于表示形式(例如使用 N*M 维的单个数组),但它可以完成。
  • 这在this post中几乎被“打死”了
  • @Jens 将所有矩阵数据存储在一个数组中会很有意义。

标签: algorithm multidimensional-array


【解决方案1】:

维基百科有一篇文章就地矩阵转置。这篇文章涵盖了非方阵。

http://en.wikipedia.org/wiki/In-place_matrix_transposition

【讨论】:

    【解决方案2】:
    for (int i=0; i<n; i++) {
      for (int j=0; j<i; j++) {
        temp = a[i][j];
        a[i][j] = a[j][i];
        a[j][i] = temp;
      }
    }
    

    【讨论】:

    • 警告!这仅适用于方阵。请参阅下面的@dlb 的 Wikipedia 链接了解非方阵实现。
    【解决方案3】:

    您没有指定语言,但一般来说,您所做的是:

    let a be your array.
    for each i,j with i<j switch a[i,j] with a[j,i]
    

    【讨论】:

    • 这也只适用于方阵。处理非方阵异常困难。
    【解决方案4】:

    要获得方阵的转置,我们需要考虑主对角线上方或下方的元素,并将每个元素与其沿主对角线的反射交换:

    for i->0 to N-1
     for j->i+1 to N-1
      swap matrix[i][j] with matrix[j][i]
    

    【讨论】:

      【解决方案5】:
      for(i=0;i<N;i++)
        for(j=0;j<N;j++)
          if(i!=j && j>i)
            {
              temp=a[i][j];
              a[i][j]=a[j][i];
              a[j][i]=temp;
            }  
      

      N 是数组的大小)

      【讨论】:

        【解决方案6】:

        为什么要打扰?只需在任何访问语句中交换索引即可。

        【讨论】:

        • 以“错误”的顺序访问 2D 数组会导致严重的性能损失——通常最好付出转置的代价以获得连续内存访问(单位步长)的好处。
        【解决方案7】:

        在c#中

        string[,] Value;
        //fill Value
        
        //create transposed array
        ValueAux = new string[Value.GetLength(1),Value.GetLength(0)];
        for (i = 0; i < Value.GetLength(0); i++)
        {
          for (j = 0; j < Value.GetLength(1); j++)
          {
            Valueaux[j, i] = Value[i, j];
          }
        }
        

        结果在 ValueAux 中

        【讨论】:

          【解决方案8】:

          这似乎运作良好:

          function transpose(a)
          {
            return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-15
            • 1970-01-01
            • 2017-08-26
            • 2015-11-14
            • 1970-01-01
            • 2015-01-06
            相关资源
            最近更新 更多