2

我有一个 NxN 矩阵,它试图通过以下代码对其进行转置:

    for(int i = 0; i < mat_size; ++i) {
        for(int j = 0; j < mat_size; ++j) {
            double tmpJI = get(j, i);
            put(j, i, get(i, j));
            put(i, j, tmpJI);
        }
    }

它不起作用,有什么问题?提前致谢。

4

5 回答 5

10

它不起作用,因为您正在与自身交换整个矩阵。您需要做的是将上面的三角形与下面的三角形交换:

for(int j = 0; j < i; ++j) {

是一种方式。

于 2013-10-22T10:37:03.463 回答
2

从 0 到 mat_size 将使您对整个矩阵重新排序两次,再次获得原始矩阵。

改成 :

for(int i = 0; i < mat_size; ++i) {
    for(int j = 0; j < i; ++j) {
        double tmpJI = get(j, i);
        put(j, i, get(i, j));
        put(i, j, tmpJI);
    }
}
于 2013-10-22T10:38:22.470 回答
1

仅当 j > i 时才需要交换。所以内循环必须从 i+1 开始。对于 j==i(中心对角线),也不需要交换。

您的解决方案不起作用,因为您实际上交换了两次(一次使用 j=x 和 i=y,一次使用 j=y 和 i=x。

于 2013-10-22T10:38:45.590 回答
0

这是因为当迭代到达对角线的另一侧时,您在矩阵的下三角形中交换的元素会再次交换。也就是说,元素被交换了两次,结果什么也没有。尝试:

for(int i = 0; i < mat_size; ++i) {
for(int j = 0; j < i; ++j) {
    double tmpJI = get(j, i);
    put(j, i, get(i, j));
    put(i, j, tmpJI);
  }
}
于 2013-10-22T10:39:53.297 回答
0

例如,(2,5) 被交换为 i=2,j=5 和 i=5,j=2。交换两次没有任何作用。

for(int i = 0; i < mat_size; ++i) {
    for(int j = 0; j < i; ++j) {
        double tmpJI = get(j, i);
        put(j, i, get(i, j));
        put(i, j, tmpJI);
    }
}
于 2013-10-22T10:36:43.040 回答