如何原地转置多维数组

6
如何原地转置一个二维矩阵?

3
是不是正方形很重要。 - Anycorn
1
@aaa:原地转置非方阵矩阵并没有太多意义。 - Jens
2
尽管这取决于表示方式(例如使用单个N * M维数组),但它是可以完成的。 - Matthieu M.
1
这个问题在 这篇帖子 中已经被反复讨论过了。 - NealB
@Jens 如果您将所有矩阵数据存储在一个单一的数组中,这将非常有意义。 - Waruyama
8个回答

7

6
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;
  }
}

3
警告!此内容仅适用于方阵。请参阅@dlb在下面提供的维基百科链接,了解非方阵矩阵实现。 - Mayank

4
你没有指定具体的语言,但通常情况下,你需要这样做:
let a be your array.
for each i,j with i<j switch a[i,j] with a[j,i]

1
这仅适用于方阵。处理非方阵矩阵是出奇的困难。 - Waruyama

2
为了得到一个方阵的转置,我们需要考虑主对角线上方或下方的元素,并将每个元素与其在主对角线上的对称位置互换:
for i->0 to N-1
 for j->i+1 to N-1
  swap matrix[i][j] with matrix[j][i]

1
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 is the size of your array)


0

在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中


0

何必大费周折?只需在任何访问语句中交换索引即可。


11
访问二维数组时,若访问顺序不当会导致严重的性能惩罚。通常情况下,为了获得连续存储器访问(单位步幅)的好处,最好付出转置的代价。 - Paul R

-1

这似乎很有效:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接