2016-12-14 106 views
-1

我试图按照高斯消除算法https://courses.engr.illinois.edu/cs554/fa2015/notes/06_lu_8up.pdf来实现LU分解并最终将其与openmp并行化。以下算法看起来是否正确,其中l是乘数,m是矩阵?在C++中实现顺序LU分解

void decompose2(double **m) { 
    begin =clock(); 
    int i=0, j=0, k=0; 

    for(k = 1; k < size - 1; k++) 
    { 
     for(i = k + 1; i < size; i++) 
     { 
     l[i][k] = m[i][k]/m[k][k]; 
     } 

     for(j = k + 1; j < size; j++) 
     { 
     for(i = k + 1; k < size; k++) 
     { 
      m[i][j] = m[i][j] - (l[i][k]*m[k][j]); 
     } 
     } 

    } 
    end = clock(); 
} 

我不认为这是正确的,因为根据不同的纸张,我在同一个数量的处理器的并行化后得到的时间是完全不同的。

回答

0

“请问下面的算法看起来是正确的,......” - 没有,因为

  • 阵列0指数在C++中,
  • (你很可能使用),是无法转换为double**
  • int不是一个好类型的迭代器(使用size_t代替),
  • 你不检查,如果m[k][k]可能是(接近)零,当你可能需要换行。

请注意,我只看到了明显的执行错误,而不是在可能的情况下使代码更好,例如,增加了计算的稳定性。