我有一個二次矩陣(二維動態指針數組),需要更改行/列順序。矩陣非常大,這就是爲什麼我決定改變指針而不是複製所有元素。我也有另一個數組,它指定了一個計算。 行排列規定了這種方式: 4,3,2,1 - 這意味着第一行必須位於第四位,第二行必須位於第三位,等等。 列的情況也是如此。 行/列置換
如何實現這種改變行順序(指針的排列)的算法?這是我的版本,但它不起作用。我想複製指針,但元素被複制而不是它,然後出現分段錯誤。 當我添加「&」得到的地址,編譯器說,這是一個語法錯誤:
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.
感謝您的想法,但該行應該爲(i = 0; i
user565447