2016-07-28 51 views
0

我具有由一個維陣列表示的矩陣,隔空矩陣的轉置中下用一維數組

例如:

矩陣

0 1 2 3 
4 5 6 7 
8 9 10 11 

陣列

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 

現在給我想找到這個轉置矩陣和陣列的尺寸,即

0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11 

我用C工作,這裏是我的代碼

#include <stdlib.h> 
#include <stdio.h> 

void transpose(int *array, int m, int n){ 
    int new_array[12]; 
    for (int i=0; i<m*n; i++) { 
     new_array[i] = ??; 
    } 
    for (int i=0; i<m*n; i++) { 
     array[i] = new_array[i]; 
    } 
} 

void print_array(int array[], int size){ 
    for (int i=0; i<size; i++) { 
     printf("%d\n",array[i]); 
    } 
} 

int main(){ 
    int array[12]; 
    for (int i=0; i<12; i++) { 
     array[i]=i; 
    } 

    print_array(array,12); 
    transpose(array,3,4); 
    print_array(array,12); 

    return 0; 
} 

我已經嘗試了十幾次都失敗了。有沒有簡單的方法來做到這一點,我錯過了?

+1

在你轉函數,如果你像這樣聲明'new_array',絕對沒有理由將'm'和'n'作爲參數。相反,做'new_array [N * M]'這更有意義 –

回答

2

使用情侶for循環,使代碼更容易理解。

void transpose(int *array, int m, int n){ 

    int new_array[12]; 
    for (int i = 0; i < m; ++i) 
    { 
     for (int j = 0; j < n; ++j) 
     { 
      // Index in the original matrix. 
      int index1 = i*n+j; 

      // Index in the transpose matrix. 
      int index2 = j*m+i; 

      new_array[index2] = array[index1]; 
     } 
    } 

    for (int i=0; i<m*n; i++) { 
     array[i] = new_array[i]; 
    } 
} 
+0

嘿,不公平的看在我的肩膀,然後不描述你在做什麼。 –

+0

@JonathanLeffler在我看來,這個答案在這裏你面前。雖然我同意,但沒有詳細的解釋。 –

+0

@JonathanLeffler,正如他們所說 - 偉大的思想家都認爲:) :) –

1

我已經改變了:

for (int i = 0 ; i < m*n ; i++) { 
    new_array[i] = ??; 
} 

到:

int ctr = 0; 
for (int i = 0 ; i <= m*n ; i++) { 
    if (ctr > m*n) 
     ctr -= m*n - 1; 
    new_array[i] = array[ctr]; 
    ctr += n; 
} 

的邏輯很簡單。每一行是n整數長,所以在2-d矩陣形式num下方的數字是n+num

2

寫在範圍[0..N)和[0..M雙環流方面的轉置),並計算對應於舊位置和新的位置上的索引:

#include <stdio.h> 

static void transpose(int *array, int m, int n) 
{ 
    int new_array[m * n]; 
    for (int i = 0; i < m; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      int old_idx = i * n + j; 
      int new_idx = j * m + i; 
      new_array[new_idx] = array[old_idx]; 
     } 
    } 
    for (int i = 0; i < m * n; i++) 
    { 
     array[i] = new_array[i]; 
    } 
} 

static void print_array(int array[], int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     printf(" %d", array[i]); 
    } 
    putchar('\n'); 
} 

int main(void) 
{ 
    int array[12]; 
    for (int i = 0; i < 12; i++) 
    { 
     array[i] = i; 
    } 

    print_array(array, 12); 
    transpose(array, 3, 4); 
    print_array(array, 12); 

    return 0; 
} 

功能必須預先申報或由靜態與我的默認編譯選項進行編譯。示出將與矩陣的任何形狀(大小)的工作transpose()函數(而原始將不起作用,如果尺寸的產物是大於12)。我也展示了陣列打印機的輸出(儘管如果它是'生產'使用的話,我可能會打印出矩陣形狀的輸出)。我確實假設你有C99,或者C11支持VLA。

$ ./trans 
0 1 2 3 4 5 6 7 8 9 10 11 
0 4 8 1 5 9 2 6 10 3 7 11 
$ 
0

你幾乎擁有了,我認爲這會做...

void transpose(int *array, int m, int n){ 
    int new_array[12]; 
    int count; 

    count = 0; 
    for (int i=0; i < n; i++) { 
     for (int j=0; j < m; j += n) { 
      new_array[count++] = i + j; 
     } 
    } 

    for (int i=0; i < m * n; i++) { 
     array[i] = new_array[i]; 
    } 
} 
+0

你試過這個嗎?你的意思是使用'new_array [count ++] = array [i + j];'?即使你的意思是從數組中複製,這也不是正確的表達式。 –

2
void transpose(int *array, int m, int n){ 
    int new_array[12]; 
    int k = 0; 
    for(int i = 0; i < n; i++){ 
     for (int j = 0; j < m; j++){ 
      new_array[k++] = array[j*n + i]; 
     } 
    } 
    for (int i=0; i<m*n; i++) { 
     array[i] = new_array[i]; 
    } 
} 
1

你可以重寫你的轉置的功能是這樣的:

static void transpose(int *array, int m, int n) 
{ 
    int *temp=malloc(m*n*sizeof(int));  //need to create a temporary array. 
    memcpy(temp,array,m*n*sizeof(int)); 
    int i, j; 

    for (i = 0; i < m; ++i) 
    { 
     for (j = 0; j < n; ++j) 
     { 
      array[j*m+i]=temp[i*n+j]; 
     } 
    } 

    free(temp); 
}