gpt4 book ai didi

c - 行/列排列

转载 作者:行者123 更新时间:2023-11-30 14:26:54 25 4
gpt4 key购买 nike

我有一个二次矩阵(二维动态指针数组),需要更改行/列顺序。矩阵非常大,这就是为什么我决定只更改指针而不是复制所有元素。我还有另一个指定计算的数组。 行排列指定如下:4,3,2,1 - 表示第一行必须在第四位,第二行必须在第三位,依此类推。列也有同样的情况。 http://xmages.net/storage/10/1/0/8/6/thumb/thumb_40561a35.jpg

如何实现这种改变行顺序(指针排列)的算法?这是我的版本,但是不起作用。我想复制指针,但复制了元素而不是它,然后出现段错误。当我添加“&”来获取地址时,编译器说这是一个语法错误:

orderOfRows[i] = &auxMatrix[computation[i]];

这是我的代码:

static int N = 6;
static int **orderOfRows;
int **sourceMatrix;
int **auxMatrix;

int main() {
int* computation = (int*)malloc(N*sizeof(int));

computation[0] = 1;
computation[1] = 6;
computation[2] = 3;
computation[3] = 7;
computation[4] = 4;
computation[5] = 2;

}
printf("After computation has been done: \n");
changeRowOrder(computation);

void changeRowOrder(int *computation) {
int i;
// change rows order and dopy them into a temp array
for(i = 0; i < N; ++i) {
// static arrays
orderOfRows[i] = auxMatrix[computation[i]];
}
// recover matrix
for(i = 0; i < N; ++i) {
auxMatrix[i] = orderOfRows[i];
}


void allocate2dMemory() {

int i = 0;
sourceMatrix = (int**)malloc(N * sizeof(int *));

if(sourceMatrix == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}

for(i = 0; i < N; i++) {
sourceMatrix[i] = (int*)malloc(N * sizeof(int));
if(sourceMatrix[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}

auxMatrix = (int**)malloc(N * sizeof(int *));

if(auxMatrix == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}

for(i = 0; i < N; i++) {
auxMatrix[i] = (int*)malloc(N * sizeof(int));
if(auxMatrix[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}

orderOfRows = (int**)malloc(N * sizeof(int *));

if(orderOfRows == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}

for(i = 0; i < N; i++) {
orderOfRows[i] = (int*)malloc(N * sizeof(int));
if(orderOfRows[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}

}
}

我将花费 2*N(复制指针然后恢复)操作而不是 N*N。我还有另一个问题:如何使用这个想法来进行列的排列?如果不可能,我该如何进行列的排列但不复制矩阵的所有元素?编程语言只有C。

最佳答案

而不是

orderOfRows[i] = &auxMatrix[computation[i]];

你应该有

for (int j = 0; j < N; ++j)
{
orderOfRows[i][j] = auxMatrix[computation[i]][j];
}
<小时/>

还有一件事:

如果您有computation[1] = 6,则意味着通过执行auxMatrix[computation[i]],您尝试访问auxMatrix[6] ,您无法执行此操作,因为 auxMatrix 的大小为 6x6。

关于c - 行/列排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8395885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com