C++ C+中的分段故障+;做矩阵乘法的时候
下面我有一个程序,它应该根据不同的索引分析矩阵乘法的时间。。但是有些函数给出了分段错误,其中两个是matmul_kji(C,A,B)和matmul_jki(C,A,B)。有人能给我解释一下我做错了什么以及可能的改进吗。此代码应检查从(1000*1000)到(10000*10000)的矩阵计时C++ C+中的分段故障+;做矩阵乘法的时候,c++,c,matrix,C++,C,Matrix,下面我有一个程序,它应该根据不同的索引分析矩阵乘法的时间。。但是有些函数给出了分段错误,其中两个是matmul_kji(C,A,B)和matmul_jki(C,A,B)。有人能给我解释一下我做错了什么以及可能的改进吗。此代码应检查从(1000*1000)到(10000*10000)的矩阵计时 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; #定义MATSIZE 1000 双进站时间(){ 结构时间值时间; if(gettimeofday(&time,NULL)){ //处理
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义MATSIZE 1000
双进站时间(){
结构时间值时间;
if(gettimeofday(&time,NULL)){
//处理错误
返回0;
}
返回(双)time.tv_sec+(双)time.tv_usec*.000001;
}
双重获取cpu时间(){
返回(双)时钟();
}
void init_mat(双M[matize][matize])
{
int i,j;
对于(i=0;i而言,问题在于:
C[i][j] += aux; // Inside matmul_kji
这是在两个嵌套循环中执行的,其中包含变量j
和k
,而不是i
和j
,因此应该是
C[j][k] = aux;
注意,您需要将+=
替换为=
,因为所有的添加都是由第三个嵌套循环完成的
还请注意,如果使用现代*方式定义循环变量,编译器可以帮助您避免此类问题:与其预先定义它们,不如在循环头中定义它们,如下所示:
for (int k=0; k<MATSIZE; k++) {
for (int j=0; j<MATSIZE; j++) {
double aux = 0;
for (int i=0; i<MATSIZE; i++) {
aux += A[i][k] *B[k][j];
}
C[i][j] += aux; // <<== Compile error!
}
}
for(int k=0;k对于没有在外循环中设置i
的两种情况,由于
C[i][j] += aux;
可能还要注意,aux+=A[i][k]*B[k][j];
在任何情况下都可能是错误的-theB[k][j]
应取决于最里面的循环变量i
。由于我不确定第一个或第二个索引是否应表示其表示中的行/列,也不确定A
或B
中的哪一个是乘法中的左/右矩阵,因此无法100%确定什么是正确的。
C[i][j] += aux;