【发布时间】:2013-04-21 18:21:24
【问题描述】:
我想通过将输入矩阵分成块然后转置它们来实现矩阵的转置。我参考了相应的帖子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
【问题讨论】:
-
“代码未按预期工作”是什么意思。它在做什么?你期待什么?
-
显示原始矩阵的第一行并给出分段错误
-
我认为您的矩阵应该编码在单个数组中,而不是数组数组中。请参阅链接问题的
Edit 2。 -
“未按预期工作”还不够好。解释您的期望,以及该计划如何未能满足这些期望。并编辑问题而不是添加 cmets 来提供缺失的细节。
-
谢谢。优秀作品。 +1
标签: c++ algorithm caching matrix