我想通過將輸入矩陣分成塊然後轉置它們來實現矩陣的轉置。我提到了相應的崗位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
你所說的「如預期的代碼不工作」的意思。它在做什麼?你在期待什麼? – 2013-04-21 18:23:44
它顯示的是信號矩陣的第一行,並給出了分段錯誤 – 2013-04-21 18:24:50
我認爲你的矩陣應該被編碼在一個數組中,而不是數組。查看鏈接問題的「編輯2」。 – didierc 2013-04-21 18:25:59