我正在使用指针对矩阵进行转置。我的代码可以成功转置矩阵的第一行,但无法转置其他行和列。我怀疑for循环存在一些问题,但是我找不到问题所在。以下是我的代码。
void transposeMatrix(int matrix[ROWS][COLS]){
int** transpose=(int **)malloc(ROWS*sizeof(int*));
for(int i=0; i< ROWS; i++)
transpose[i]=(int*)malloc(COLS*sizeof(int));
for(int i=0; i<ROWS;i++){
puts("");
for(int j=0; j<COLS;j++){
*(transpose+i*ROWS+j)= *(matrix+j*COLS+i);
printf("%d ",transpose[j][i]);
}
puts("");
}
}
矩阵生成随机数,问题看起来像这样:
Original Matrix:
10 20 30
40 50 60
70 80 90
Transpose Matrix:
10 0 43009213
20 3401401 910429
30 0 134910124
我无法附加图片,因此以上只是我所遇到问题的详细说明,实际情况并非完全一样,而是非常相似。
谢谢您的帮助!
答案 0 :(得分:0)
*(transpose+i*ROWS+j)
不是访问指针数组元素的正确方法。这样便可以访问按行优先顺序连续存储在int[]
数组或通过int*
指针的二维数组中。
使用*(*(transpose + i)+j)
访问实现为指针数组的二维数组元素的方法。 *(transpose + i)
返回指向行i
的指针,将j
添加到该行将返回该行中第j
列的地址,并进行递归以获取或设置该值。
这也适用于声明为
的数组int matrix[ROWS][COLS];
由于数组衰减到指针的方式。
因此您的任务行应为:
*(*(transpose + i)+j) = *(*(matrix + j)+i);
然后,您需要更改printf()
行,因为它不会打印您刚刚分配的相同元素。应该是:
printf("%d ", transpose[i][j]);
完整的工作功能是:
void transposeMatrix(int matrix[ROWS][COLS]){
int** transpose=(int **)malloc(ROWS*sizeof(int*));
for(int i=0; i< ROWS; i++)
transpose[i]=(int*)malloc(COLS*sizeof(int));
for(int i=0; i<ROWS;i++){
puts("");
for(int j=0; j<COLS;j++){
*(*(transpose + i)+j) = *(*(matrix + j)+i);
printf("%d ",transpose[i][j]);
}
puts("");
}
}
答案 1 :(得分:0)
识别每个单元格的行和列的存储位置时遇到问题 使用它们的方法如下:
i-th rows of transpose = *(transpose + i)
j-th col in i-th row of transpose = *(*(transpose+i) + j)
类似于矩阵:
i-th rows of matrix= *(matrix + i)
j-th col in i-th row of matrix = *(*(matrix+i) + j)
这是我的解决方法:
void transposeMatrix(int matrix[ROWS][COLS]) {
int** transpose = (int **)malloc(ROWS * sizeof(int*));
for (int i = 0; i < ROWS; i++)
transpose[i] = (int*)malloc(COLS * sizeof(int));
for (int i = 0; i < ROWS; i++) {
puts("");
for (int j = 0; j < COLS; j++) {
*(*(transpose + i) + j) = *(*(matrix + j) + i);
printf("%d ", transpose[i][j]);
}
puts("");
}
}
答案 2 :(得分:0)
您不必逐行分配新的矩阵。另外,可以进行转置和打印的功能直接传递给int *
,而不是像int [3][2]
等预成形数组那样传递。
甚至可以在适当位置重塑矩阵(即无需分配新空间)。如果您愿意,我可以稍后发布示例代码。
例如:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int M[2][3] = { {1, 2, 3}, {7, 8, 9} };
int N[3][3] = { {1, 2, 3}, { 4, 5, 6 }, {7, 8, 9} };
int *alloc_transpose(const int *matrix, size_t rows, size_t cols);
void print_matrix(const int *matrix, size_t rows, size_t cols);
int main()
{
int *t_matrix;
print_matrix(&M[0][0], 2, 3);
fprintf(stderr, "----\n");
t_matrix = alloc_transpose(&M[0][0], 2, 3);
if (t_matrix) {
print_matrix(t_matrix, 3, 2);
}
free(t_matrix);
t_matrix = alloc_transpose(&N[0][0], 3, 3);
if (t_matrix) {
fprintf(stderr, "----\n");
print_matrix(t_matrix, 3, 3);
}
free(t_matrix);
return 0;
}
void print_matrix(const int *matrix, size_t rows, size_t cols)
{
size_t r, c;
for (r = 0; r < rows; r++) {
for (c = 0; c < cols; c++) {
printf("%d ", *((matrix + r * cols) + c));
}
putchar('\n');
}
}
int *alloc_transpose(const int *matrix, size_t rows, size_t cols)
{
int *tm;
int r, c; /* relative to transposed matrix */
tm = malloc(sizeof(int) * cols * rows); /* contiguous is okay */
if (!tm)
return NULL;
for (r = 0; r < rows; r++) {
for (c = 0; c < cols; c++) {
*((tm + c * rows) + r) =
*((matrix + r * cols) + c);
}
}
return tm;
}