尝试创建一个在给定数组中转置矩阵的函数。
我的转置函数如下所示:
void transpose(int a[], int rowSize, int colSize){
int d[size];
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
int index1 = i*colSize+j;
int index2 = j*rowSize+i;
d[index2] = a[index1];
}
}
for (int i=0; i<size; i++) {
a[i] = d[i];
}
for (int i = 0; i < size; i++) {
if (i % colSize == 0) {
printf("\n");
}
printf("%d ", d[i]);
}
}
但是给定一个数组/矩阵:
int c[size] = {
1, 4,
2, 3,
3, 2,
4, 1
};
它返回:
1 3 4 2
2 4 3 1
所需的矩阵应如下所示:
1 2 3 4
4 3 2 1
答案 0 :(得分:0)
这又是一个逻辑。在这里,如果您正在使用其他数组,那么它将类似于数组的有序遍历。
void transpose(int a[], int colSize, int rowSize) {
/* int *d = malloc(sizeof(int)*colSize*rowSize);
if( d == NULL){
fprintf(stderr,"%s","Error in malloc");
exit(1);
}
*/
int d[rowSize*colSize];
int sz=0;
for(int j=0;j<colSize;j++)
for(int i=0;i<rowSize;i++)
{
d[sz++]=a[i*colSize+j];
}
for(int i=0;i<sz;i++)
a[i]=d[i];
// free(d);
}
对代码的评论很少: -
每当您使用malloc
时,请检查其返回类型。如果没有分配任何东西,那么你将防止爆炸。
一旦完成工作,必须释放动态分配的内存。它可以帮助您避免内存泄漏。
VLA支持可在C99,C11中获得。
答案 1 :(得分:0)
您的索引映射逻辑是正确的!
请记住,d
的{{1}}是colSize
的{{1}}。
因此转换矩阵的新a
为rowSize
而不是i % colSize == 0
,而不是i % rowSize == 0
。
这假设您的参数:colSize
和rowSize
是矩阵rowSize
的行和列大小。并且您的1维索引水平增加(沿着列)。
colSize
使用新值填充旧数组与您已经完成的方式没有什么不同。只需确保使用a
切换#include <stdio.h>
#include <stdlib.h>
// i -> j, j -> i
int index_map_transpose(int i, int j, int transposedColSize) {
return j * transposedColSize + i;
}
int index_map(int i, int j, int colSize) {
return i * colSize + j;
}
int *transpose(int m[], int rowSize, int colSize)
{
int *t = malloc(rowSize * colSize * sizeof(int));
if (t == NULL) {
fprintf(stderr, "Memory error");
exit(EXIT_FAILURE);
}
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
// Index (i, j) maps to (j, i) by defintiion of transpose
int origional = index_map(i, j, colSize);
int transposed = index_map_transpose(i, j, rowSize);
t[transposed] = m[origional];
}
}
return t;
}
void print_matrix(int m[], int rowSize, int colSize)
{
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
if (j > 0) {
printf(" ");
}
printf("%d", m[index_map(i, j, colSize)]);
}
printf("\n");
}
}
int main(void)
{
int rowSize = 4; int colSize = 2;
int a[8] = {1, 4, 2, 3, 3, 2, 4, 1};
print_matrix(a, rowSize, colSize);
// Prints:
// 1 4
// 2 3
// 3 2
// 4 1
printf("Transposing...\n");
int *t = transpose(a, rowSize, colSize);
print_matrix(t, colSize, rowSize);
// Prints:
// 1 2 3 4
// 4 3 2 1
// Remember to free!
free(t);
// Another test
printf("Test 2\n");
// Test with
rowSize = 2; colSize = 3;
int b[6] = { 3, 2, 7, 4, 9, 1 };
print_matrix(b, rowSize, colSize);
// Prints
// 3 2 7
// 4 9 1
printf("Transposing...\n");
t = transpose(b, rowSize, colSize);
print_matrix(t, colSize, rowSize);
// Result
// 3 4
// 2 9
// 7 1
free(t);
return EXIT_SUCCESS;
}
!