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
4

1 に答える 1

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";
于 2013-04-21T18:32:10.210 に答える