2011-12-06 23 views
0

我有一個二次矩陣(二維動態指針數組),需要更改行/列順序。矩陣非常大,這就是爲什麼我決定改變指針而不是複製所有元素。我也有另一個數組,它指定了一個計算。 行排列規定了這種方式: 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.

回答

1

而不是

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],你c不要因爲auxMatrix的尺寸是6x6。

+0

感謝您的想法,但該行應該爲(i = 0; i user565447

1

如果你希望能夠換行和列沒有複製,你將需要有兩個輔助指標:

int *row_index; 
int *col_index; 

,並利用這些訪問矩陣的元素:

element = matrix[row_index[row]][col_index[col]]; 

要交換行或列,只需交換row_index或col_index的相應元素。

+0

拜託,你能舉個例子嗎,我該如何改變列的順序。我知道如何更改行的順序,我已經在上面描述了它(請參閱圖片)。我無法想象改變列順序的操作,因爲我們沒有指向每列的開始。 – user565447