2013-04-21 107 views
2

我想通過將輸入矩陣分成塊然後轉置它們來實現矩陣的轉置。我提到了相應的崗位A Cache Efficient Matrix Transpose Program?,寫我的代碼是這樣的:塊矩陣轉置

#include<iostream> 
#include<stdlib.h> 
#define m 4 
#include<sys/time.h> 
#include<time.h> 
#include<malloc.h> 

using namespace std; 

int **a, **b, **c; 
int count = 0; 
clock_t t1, t2;  
int blocksize = 2; 

int main(){ 
    a = (int **)malloc(m*sizeof(int *)); 
    for(int i = 0;i<m;i++){ 
      a[i] = (int *)malloc(m*sizeof(int)); 
    } 
    b = (int **)malloc(m*sizeof(int *)); 
    for(int i = 0;i<m;i++){ 
      b[i] = (int *)malloc(m*sizeof(int)); 
    } 
    for(int i=0; i<m; i++){ 
      for(int j =0; j<m; j++){ 
        a[i][j]=(2*i)+(3*j); 
      } 
    } 
    for(int i=0; i<m; i++){ 
      for(int j =0; j<m; j++){ 
        cout << a[i][j] << "\t"; 
      } 
      cout << "\n"; 
    } 
    cout << "\n"; 
    t1 = clock(); 
    // MAIN BLOCK TRANSPOSE CODE 
    for (int i = 0; i < m; i += blocksize) { 
     for (int j = 0; j < m; j += blocksize) { 
        for (int k = i; k < i + blocksize; ++k) { 
          for (int l = j; l < j + blocksize; ++l) { 
            b[k + l*m] = a[l + k*m]; 
          } 
        } 
      } 
    } 
    t2 = clock(); 
    for(int i=0; i<m; i++){ 
      for(int j =0; j<m; j++){ 
        cout << b[i][j] << "\t"; 
      } 
      cout << "\n"; 
    } 
    free(a); 
    free(b); 
    cout << "\n"; 
    cout << (double)(t2-t1)/CLOCKS_PER_SEC << "\n"; 
return 0; 
} 

但是,按預期的代碼不工作。我實現了據說在相應的職位工作的代碼。如果可能的話請幫忙。

輸入數組:

0  3  6  9 
2  5  8  11 
4  7  10  13 
6  9  12  15 

預期輸出數組:

0  2  4  6 
3  5  7  9 
6  8  10  12 
9  11  13  15 

獲得的結果:

0  3  6  9 
Segmentation fault 
+0

你所說的「如預期的代碼不工作」的意思。它在做什麼?你在期待什麼? – 2013-04-21 18:23:44

+0

它顯示的是信號矩陣的第一行,並給出了分段錯誤 – 2013-04-21 18:24:50

+0

我認爲你的矩陣應該被編碼在一個數組中,而不是數組。查看鏈接問題的「編輯2」。 – didierc 2013-04-21 18:25:59

回答

2

我想你的矩陣應該在單個陣列中要被編碼的,而不是在數組數組中(參見鏈接問題的編輯2)。

你可能想嘗試,而不是:

int *a, *b, *c; 

a = (int *)malloc(m*m*sizeof(int)); 
b = (int *)malloc(m*m*sizeof(int)); 
for(int i=0; i<m; i++){ 
     for(int j =0; j<m; j++){ 
       a[i*m+j]=(2*i)+(3*j); 
     } 
} 
for(int i=0; i<m; i++){ 
     for(int j =0; j<m; j++){ 
       cout << a[i*m+j] << "\t"; 
     } 
     cout << "\n"; 
} 
cout << "\n"; 
+0

超棒的男人!謝謝。這個簡單的修改使我的程序正常工作:) – 2013-04-21 18:39:05

+0

沒問題,很高興能有所幫助。 – didierc 2013-04-21 18:40:06