我想在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 acess的错误。有什么提示吗?
答案 0 :(得分:2)
你在for-loop中对整个矩阵建立索引(我假设你的矩阵是正方形的)...你只需要索引矩阵的下三角形或上三角形,然后交换那些在矩阵的相对三角形中具有相应索引的位置。要转置矩阵的对角线,您只需要将对角线的上半部分与下半部分交换。通过对整个矩阵进行索引,您最终会进行双转置,最终会返回与原始矩阵完全相同的结果。