Fortran 给定一个巨大的对称正定矩阵,如何计算其逆矩阵的几个对角元素?
更新:这是一个纯粹的Fortran问题 考虑aFortran 给定一个巨大的对称正定矩阵,如何计算其逆矩阵的几个对角元素?,fortran,Fortran,更新:这是一个纯粹的Fortran问题 考虑apxp对称正定矩阵a(p=70000,即a使用8字节双精度大约为40GB)。我们要计算逆矩阵的前三个对角元素inv(A)[1,1],inv(A)[2,2]和inv(A)[3,3] 我找到了James R.Bunch,他似乎在不计算全逆的情况下解决了这个精确的问题inv(A)不幸的是,他使用Fortran和LINPACK,这两种语言我从未使用过 我试图理解这个函数: SUBROUTINE SOLVEJ(A,LDA,P,Y,J) INTE
p
xp
对称正定矩阵a
(p=70000,即a
使用8字节双精度大约为40GB)。我们要计算逆矩阵的前三个对角元素inv(A)[1,1]
,inv(A)[2,2]
和inv(A)[3,3]
我找到了James R.Bunch,他似乎在不计算全逆的情况下解决了这个精确的问题inv(A)
不幸的是,他使用Fortran和LINPACK,这两种语言我从未使用过
我试图理解这个函数:
SUBROUTINE SOLVEJ(A,LDA,P,Y,J)
INTEGER LDA,P,J
REAL A(LDA,1),Y(1)
C
INTEGER K
Y(J) = 1/A(J,J)
DO 10 K = J + 1,P
Y(K) = - SDOT(K - J,A(J,K),1,Y(J),1)/A(K,K)
10 CONTINUE
RETURN
END
其中,A
是大小为LDA x p的矩阵,Y
是长度为p的向量
你能解释一下为什么他在函数头中定义了
Y(1)
,然后分配给Y(J)
?Fortran不关心定义数组的大小,让你访问它的末端以外的部分吗?为什么不定义Y(P)
,根据?这似乎是可能的。首先,您应该了解不同的Fortran版本,特别是77与90/95及更高版本,而且您确实可以(通常)像C中一样越界。Fortran中的数组可能会引起很多混乱,我想说这有点混乱。为了将讨论局限于您的特定情况,我们可以使用以下事实:这是关于伪数组的,伪数组是出现在过程的伪参数列表中的数组。对于虚拟阵列,我们可以有3种类型:
Y(1)
工作是因为您可能会越界,但这是非常糟糕的,因为当您使用-fcheck=bounds
编译程序时,程序将失败。应编写有效的Fortran 77:
REAL A(LDA,*),Y(*)
或者更好:
REAL A(LDA,P),Y(P)
看起来LAPACK确实集成到了MATLAB中;看见许多基本的矩阵运算,如
mldivide
lu
,qr
等,都是从LAPACK调用的。如果你发现了,不知道,在阅读那篇文章时可能会有所帮助。看起来很多都是基于Cholesky分解的。@严格来说:是的,MATLAB使用LAPACK进行大量计算;但我的问题是关于我上面提到的两个功能,以及它们是否是LAPACK的一部分。我已经找过了,但没有找到,所以我担心答案是否定的。这个问题伤了我的大脑。怎么样?@yiuh我想知道这两个中哪一个更好。因为我对Fortran方面的东西更不确定,我在寻找关于这个东西的实现的信息,所以我觉得自己是一个更好的网站。。。但请随意提议将其转移!IIRC使用1表示边界而不是*是Fortran 66的遗留问题,Fortran 66没有*。感谢您的解释。我试着在谷歌上搜索“伪数组”和“伪参数”-我是否正确理解在Fortran中,“伪参数”是调用方提供内存,然后由被调用函数填充的参数?@Jonas Heidelberg:不,“伪参数”是指在过程中引用参数时使用的术语。实际参数是与过程条目上的伪参数关联的实际数据。粗略地说,请参阅标准以获得正确的定义。@Jonas Heidelberg-尝试将伪参数视为实际数据的“占位符”。