Algorithm 如何就地转置多维数组

Algorithm 如何就地转置多维数组,algorithm,multidimensional-array,Algorithm,Multidimensional Array,如何将2D矩阵转置到位?对于(int i=0;i您尚未指定语言,但通常您要做的是: 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; } } let a be your array. for each i,j with i<j switch a[i,j] with a[j,i] 让a成为您

如何将2D矩阵转置到位?

对于(int i=0;i您尚未指定语言,但通常您要做的是:

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;
  }
}
let a be your array.
for each i,j with i<j switch a[i,j] with a[j,i]
让a成为您的数组。

对于每一个i,j,i i p>得到一个正方形矩阵的转置,我们需要考虑主对角线之上或下方的元素,并用它的反射沿主对角线交换:

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

何必麻烦呢?只要在任何access语句中交换索引就行了。

维基百科有一篇关于矩阵变换的文章。这篇文章涵盖了非平方矩阵


这似乎很有效:

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

字符串[,]值;
//填充值
//创建转置数组
ValueAux=新字符串[Value.GetLength(1),Value.GetLength(0)];
for(i=0;i

结果为(i=0;是否为平方?这会产生很大的影响)的ValueAux

difference@aaa:将一个非正方形矩阵转置到位没有多大意义。尽管这取决于表示(例如使用N*M维的单个数组),但它是可以做到的。这几乎是“活活打死”了在@Jens中,如果您将所有矩阵数据存储在一个数组中,这是非常有意义的。以“错误”的顺序访问2D数组会带来严重的性能损失-为了获得连续内存访问的好处,通常最好支付转置的代价(单位步长)。警告!这仅适用于方形数组。有关非方形矩阵的实现,请参阅下面的@dlb的Wikipedia链接。这也仅适用于方形矩阵。处理非方形矩阵异常困难。
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;
      }  
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;
      }