转置前导维数N的1D阵列

时间:2010-04-02 12:43:25

标签: arrays matrix transpose

如何在没有额外空间的情况下转换一个前导维数N的1d数组?任何语言都没问题

3 个答案:

答案 0 :(得分:3)

我的1D就地矩阵换位解决方案

  mn    = M*N;      /* M rows and N columns */

  q     = mn - 1;

  i = 0;      /* Index of 1D array that represents the matrix */

  do {

    k = (i*M) % q;

    while (k>i) k = (M*k) % q;

    if (k!=i) Swap(k, i);

  } while ( ++i <= (mn -2) );

  /* Update row and column */

  matrix.M = N;

  matrix.N = M;

答案 1 :(得分:2)

将表示为线性阵列的非正方形矩阵转置为位 一招

这是一个执行就地转置的REXX程序 以二维表示的二维矩阵 尺寸 M * N 的尺寸数组,其中 M 是数量 行和 N 是其中的列 非转置数组。转置后, M 成为列数和 N 成为行数。

i = 0                /* linear array index */ 
do j = 1 to N        /* j = 1 to columns of non-transposed array */ 
  do k = 1 to M      /* k = 1 to rows of non-transposed array */ 
    i = i + 1
    t = (k - 1) * N + j 
    do while t < i 
      jp = (t - 1) % M + 1 
      kp = t - (jp - 1) * M 
      t = (kp - 1) * N + jp 
    end 
    if i \= t then say 'exchange('i',' t')'   /* swap elements */
  end 
end

上面的程序显示了必须交换以产生转置数组的数组元素。

此程序适用于任何人 尺寸矩阵表示为线性阵列,其中元件排列 按列然后行。例如,M×N矩阵的元素排列如下:

X 1,1 ,X 1,2 ,... X 1,N ,X 2,1 < / sub>,X 2,2 ,... X 2,N ,... X M,N

程序打印出需要交换以产生的元素的线性数组索引 转换矩阵的形式:

X 1,1 ,X 2,1 ,... X M,1 ,X 1,2 < / sub>,X 2,2 ,... X M,2 ,... X M,N

例如,从M = 4开始,N = 2,并且数组包含:

A1, B1, A2, B2, A3, B3, A4, B4

执行以下交换:

exchange(2, 3) 
exchange(3, 5) 
exchange(4, 7) 
exchange(6, 7)

并且安排变为:

A1, A2, A3, A4, B1, B2, B3, B4

这是如何运作的?

以符号开头,将线性数组中的每个元素标识为:

X[i,j,k] 

where: i is the linear array index for an element in X 
       j is the row number for element in X
       k is the column number for element in X

使用此表示法,行主要顺序中的数组可以生成为:

i = 0 
do j = 1 to M    /* Row counter */ 
  do k = 1 to N  /* Column counter */ 
    i = i + 1     /* array index of element j, k */ 
    say 'X['i','j','k']' 
  end 
end

请注意, j (行)和 k (列), i 的给定值, X的线性数组索引 i,j ,可以计算为:

i = (j - 1) * N + k 

通过交换元素构建矩阵 X 的转置 X [i,j,k] X [t,k,j] j = 1到M 范围内 > k = 1至N 提供 i&gt;吨即可。在 本质我们交换所有 列变量的行变量。使用上述符号,这个数量 交换线性数组元素:

exchange(X[i,j,k], X[t,k,j])

鉴于 j k 的值,我们可以将 i t 的值计算为:

   i = (j - 1) * N + k
   t = (k - 1) * M + i

现在,继续通过线性阵列进行上述交换,因为 i 从1增加到M * N. 请注意,每次迭代后, X 的所有元素的索引都小于或等于 i 被转置。这是 因为每次迭代只在正确的元素出现时才完成 换成 X [i]

每当 i&gt; t ,这意味着先前的交易发生在指数 t t 的元素是 如上所述进行交换,将其置于某个新位置 t prime 。鉴于 指数 t ,我们可以计算行主要指数 t prime 以及行和 与之关联的列号如下:

j prime =(t - 1)%M + 1
k prime = t - (j prime - 1)* M
t prime =(k prime - 1)* N + j prime

同样,如果 t prime 小于 i ,则表示此元素已被交换 我们也必须继续 进行另一轮计算。将 t 设置为计算出的 t prime 并重复。最终,会 变得低于 t 并且可以进行交换。基本上我们遵循所有的元素 之前的交换,直到我们在 i 或线性阵列中的 i 右侧找到它。

对线性阵列中的每个元素重复此循环,矩阵将被转置。

答案 2 :(得分:1)

最简单的方法就是:

for each m
  for each n
    if m != n 
       swap A[m][n] and A[n][m]

这仅适用于方形矩阵。对于矩形矩阵的就地转置,事情变得有点棘手。