2012-03-30 161 views
1

我想转置一个C矩阵,尽可能少的内存使用。因此,不能简单地创建矩阵的副本,填写它,然后删除另一个。因此,我希望在矩阵本身上进行每次交换,并重新使用1个临时变量。矩阵元素使用指针算术进行索引,但据我所知,这些都是正确的。现在的问题是该功能不会导致任何更改。矩阵结构是动态分配的,具有以下结构;动态分配的二维矩阵转置(内存有效)

typedef struct { 
int rows; 
int cols; 
int** data; 
    } matrix; 

我现在写的转置函数看起来如下;

void transpose(matrix* m){ 
int i,j,temp; 
for(i=0;i<m->row;i++){ 
    for(j=0;j<m->col;j++){ 
     temp=*((*(m->data+i))+j); 
     *((*(m->data+i))+j)=*((*(m->data+j))+i); 
     *((*(m->data+j))+i)=temp; 
    } 
} 

}

我已经尝试过用

int* temp=(int*)malloc()sizeof(int); 

启动功能,并与

free(temp); 

这给了我在Visual Studio约ADRES接取一个错误的结局。有小费吗?

+0

如果是正方形(rows == cols),则只能像这样在原地进行转置。如果不是正方形,那么就有方法,但它们要复杂得多。 – 2012-03-30 13:56:49

+0

[使用1D数组的原地矩阵转置]可能的重复(http://stackoverflow.com/questions/9902767/in-place-matrix-transposition-using-a-1d-array) – 2012-03-30 13:57:44

回答

2

你正在索引整个矩阵在你的for循环(我假设你的矩阵是正方形的)......你只需要索引矩阵的下三角或上三角,然后交换那些在矩阵的相反三角形中具有相应指标的位置。要转置矩阵的对角线,只需将对角线的上半部分与下半部分交换即可。通过对整个矩阵进行索引,您最终将执行双重转置,最终返回与原始矩阵完全相同的结果。

+0

确实,愚蠢的算法错误我的。谢谢,如果你现在看它,那是一个明显的错误,但它让我头疼:p – Mathieu 2012-03-30 14:15:14