【问题标题】:Adding pivoting functionality to a Doolittle algorithm向 Doolittle 算法添加旋转功能
【发布时间】:2017-06-30 00:52:40
【问题描述】:

到目前为止,我有这段代码用于 LU 分解。它接受一个输入数组并返回下三角矩阵和上三角矩阵。

void LUFactorization ( int d, const double*S, double*L, double*U )
{
   for(int k = 0; k < d; ++k){
       if (
      for(int j = k; j < d; ++j){
         double sum = 0.;
         for(int p = 0; p < k; ++p) {
             sum+=L[k*d+p]*L[p*d+j];
             cout << L[k*d+p] << endl;
         }
         sum = S[k*d+j] - sum;
         L[k*d+j]=sum;           
        U[k*d+j]=sum;
      }
      for(int i = k + 1; i < d; ++i){
         double sum=0.;
         for(int p = 0; p < k; ++p) sum+=L[i*d+p]*L[p*d+k];
         L[i*d+k]=(S[i*d+k]-sum)/L[k*d+k];
      }
   }

   for(int k = 0; k < d; ++k){
      for(int j = k; j < d; ++j){
         if (k < j) L[k*d+j]=0;
         else if (k == j) L[k*d+j]=1;
      }
   }
}

有什么方法可以调整它来执行行交换吗?如果没有,是否有其他算法可以指导我?

谢谢

【问题讨论】:

  • 在我提供完整答案之前,您是否知道,由于您从j=k 迭代到d,条件k &lt;= j 始终为真?因此,您将关于上对角矩阵的相同信息存储在 L 和 U 中,稍后仅在 L 中将其归零。
  • 是的,我意识到了这一点,并对其进行了编辑。谢谢!

标签: c++ algorithm linear-programming factorization


【解决方案1】:

使用旋转进行 LU 分解的常用方法是存储一个置换数组 P,它被初始化为恒等置换 (P={0,1,2,...,d - 1}),然后交换 P 中的条目,而不是交换 S 中的行

如果您有此排列数组,则每次访问 S 都必须使用 P[i] 而不是 i 作为行号。

请注意,P 本身是输出的一部分,因为它表示置换矩阵,因此
P*A = L*U,所以如果你想用它来求解线性方程组,你必须申请P 在应用向后和向前替换之前的右侧

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2010-09-07
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多