我有一个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);
}
}
它不起作用,有什么问题?提前谢谢。
答案 0 :(得分:10)
由于您自己交换整个矩阵,因此无法正常工作。你需要做的是将上三角形与下三角形交换:
for(int j = 0; j < i; ++j) {
是一种方式。
答案 1 :(得分: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);
}
}
答案 2 :(得分:1)
只有在j&gt;时才需要交换一世。所以内循环必须从i + 1开始。对于j == i(中心对角线),也不需要交换。
你的解决方案不起作用,因为你实际上交换了两次(一次是j = x,i = y,一次是j = y,i = x。
答案 3 :(得分: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);
}
}
答案 4 :(得分: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);
}
}