Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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
Fortran 给定一个巨大的对称正定矩阵,如何计算其逆矩阵的几个对角元素?_Fortran - Fatal编程技术网

Fortran 给定一个巨大的对称正定矩阵,如何计算其逆矩阵的几个对角元素?

Fortran 给定一个巨大的对称正定矩阵,如何计算其逆矩阵的几个对角元素?,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

更新:这是一个纯粹的Fortran问题

考虑a
p
x
p
对称正定矩阵
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种类型:

  • 显式形状:显式声明尺寸
  • 假定形状:没有给定维度,只有冒号表示数组的秩
  • 假定大小:最后一个维度是星号,前导维度是显式声明的
  • 使事情复杂化的是,(3)可以与(1)分组,(2)通常与延迟形状数组分组,例如可分配数组。延迟形状和假定形状仅适用于Fortran 90/95及更高版本,如果要将它们用作伪参数,则需要显式接口,因此通常在模块中使用

    因此,在您的例子中,虽然
    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-尝试将伪参数视为实际数据的“占位符”。