【发布时间】:2020-09-21 02:08:53
【问题描述】:
我有两个对称矩阵A、B 和一个向量X。 A的维数是n×n,B的维数是n×n,X的维数是n×1。让矩阵的ith行和jth列的元素A 表示为A[i,j]。
由于A是对称的,所以只保存A的上三角矩阵的每一列。矩阵A保存为数组:
Vector_A = [A[1,1],
A[1,2], A[2,2],
A[1,3], A[2,3], A[3,3],
A[1,4], A[2,4], A[3,4], A[4,4],
...,
A[1,n], A[2,n], ..., A[n,n]]
矩阵B 以与矩阵A 相同的格式保存。现在我想计算ABA,而不将Vector_A、Vector_B 转换回矩阵A, B。由于ABA 也是对称的,我想以与数组相同的方式保存ABA。我如何在 Julia 中做到这一点?
我还想计算X'AX,而不将Vector_A 转换回矩阵A,其中X' 表示transpose(X)。我如何在 Julia 中做到这一点?
【问题讨论】:
-
您确定需要高效存储矩阵吗?完整阵列的常规内存布局可能会超过性能优势。但是如果你真的需要节省内存,你最好写一个新的
EfficientSymmetric{T} <: AbstractArray{T,2}结构,这样你就可以“像数组一样使用它”。也许这个讨论是相关的? discourse.julialang.org/t/symmetric-matrices/4086 -
AFAIK,Julia 具有稀疏矩阵类型。因此,与其构建自己的优化布局,不如使用稀疏矩阵。
-
我最后一次想到这一点是在我的ForecastEval.jl 包中处理算法模型置信度集时。我以两种方式实现该算法:1) 仅存储矩阵的上三角部分以节省内存,2) 存储整个矩阵,它使用两倍的内存,但允许我使用 BLAS 例程。第二种算法运行速度明显更快。第一个选项可能确实更适合您的问题,但至少也值得研究第二个。
标签: julia