我想用 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 中出现有关地址访问的错误。有什么建议吗?
最佳答案
您在 for 循环中对整个矩阵进行索引(我假设您的矩阵是正方形)...您只需要对矩阵的下三角或上三角进行索引,然后交换它们在矩阵的对立三角形中具有相应索引的位置。要转置矩阵的对角线,只需将对角线的上半部分与下半部分交换即可。通过对整个矩阵进行索引,您最终会进行双转置,最终返回与原始矩阵完全相同的结果。
关于c - 动态分配的二维矩阵转置(内存有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944282/