Fortran - 将变量传递给CGESV

时间:2015-03-03 22:23:43

标签: fortran lapack

我正在尝试测试LAPACK方法CGESV,但我遇到了一个问题。我想在我的代码的其他部分重用我的'A'矩阵,但是当我将它传递给方法时它会改变。 'A'的定义:

(input/output) COMPLEX array, dimension (LDA,N)
      On entry, the N-by-N coefficient matrix A.
      On exit, the factors L and U from the factorization
      A = P*L*U; the unit diagonal elements of L are not stored.

除了创建临时变量来存储值之外,有没有办法在将它传递给CGESV之后保留A的值?

2 个答案:

答案 0 :(得分:1)

例程就地工作,因此保留原始数组的唯一方法是制作副本。

答案 1 :(得分:1)

正如您已经注意到,A矩阵被P*L*U分解覆盖。如果矩阵的大小不是那么大,您可以复制A矩阵的内容并使用该副本进行分解。

         CALL CCOPY(N*N, A, 1, A_NEW, 1)

如果矩阵大小太大而无法在内存中保留两个副本,则可以使用分解矩阵执行数学运算。例如,计算y=A*x

*        y = x
         CALL CCOPY(N, X, 1, Y, 1)
*        y = U * y
         CALL CTRMV('Upper', 'No transpose', 'Non-unit', N, A, N, Y, 1)
*        y = L * y
         CALL CTRMV('Lower', 'No transpose', 'Unit', N, A, N, Y, 1)
*        y = P * y
         CALL DLASWP( 1, Y, N, 1, N, IPIV, 1 )

所需的额外内存是整数IPIV大小N