如何在没有额外空间的情况下转换一个前导维数N的1d数组?任何语言都没问题
答案 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]
这仅适用于方形矩阵。对于矩形矩阵的就地转置,事情变得有点棘手。