Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的分段故障+;做矩阵乘法的时候_C++_C_Matrix - Fatal编程技术网

C++ C+中的分段故障+;做矩阵乘法的时候

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)){ //处理

下面我有一个程序,它应该根据不同的索引分析矩阵乘法的时间。。但是有些函数给出了分段错误,其中两个是matmul_kji(C,A,B)和matmul_jki(C,A,B)。有人能给我解释一下我做错了什么以及可能的改进吗。此代码应检查从(1000*1000)到(10000*10000)的矩阵计时

#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间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];
在任何情况下都可能是错误的-the
B[k][j]
应取决于最里面的循环变量
i
。由于我不确定第一个或第二个索引是否应表示其表示中的行/列,也不确定
A
B
中的哪一个是乘法中的左/右矩阵,因此无法100%确定什么是正确的。
C[i][j] += aux;