【发布时间】:2020-08-07 22:16:12
【问题描述】:
我很难理解如何在 Julia 中扩展模块。具体来说,我想创建自己的LinearAlgebra 矩阵,其父类为AbstractMatrix{T},并实现其功能类似于Diagonal 或UpperTriangular 矩阵在实际LA 包中的实现方式。如果我可以从字面上将我的矩阵添加到原始包中,那么我会,但现在我满足于创建自己的 MyLinearAlgebra 包,它只是导入原始包并对其进行扩展。这是我目前在MyLinearAlgebra.jl 中得到的信息:
module MyLinearAlgebra
import LinearAlgebra
import Base: getindex, setindex!, size
export
# Types
LocalMatrix,
SolutionVector,
# Functions
issymmetric,
isdiag
# Operators
# Constants
include("SolutionVector.jl")
include("LocalMatrix.jl")
end
现在只关注LocalMatrix.jl,我有:
"""
struct LocalMatrix{T} <: AbstractMatrix{T}
Block diagonal structure for local matrix. `A[:,:,s,iK]` is a block matrix for
state s and element iK
"""
struct LocalMatrix{T} <: AbstractMatrix{T}
data::Array{T,4}
function LocalMatrix{T}(data) where {T}
new{T}(data)
end
end
[... implement size, getindex, setindex! ... all working perfectly]
"""
issymmetric(A::LocalMatrix)
Tests whether a LocalMatrix is symmetric
"""
function issymmetric(A::LocalMatrix)
println("my issymmetric")
all(LinearAlgebra.issymmetric, [@view A.data[:,:,i,j] for i=1:size(A.data,3), j=1:size(A.data,4)])
end
"""
isdiag(A::LocalMatrix)
Tests whether a LocalMatrix is diagonal
"""
function isdiag(A::LocalMatrix)
println("my isdiag")
all(LinearAlgebra.isdiag, [@view A.data[:,:,i,j] for i=1:size(A.data,3), j=1:size(A.data,4)])
end
但是,当我尝试运行它时,我得到了
方法定义错误:必须显式导入函数 LinearAlgebra.isdiag 才能扩展
好的,没问题,我可以将定义更改为function LinearAlgebra.isdiag(),它可以工作。但是,如果我还将另一个函数的定义更改为 function LinearAlgebra.issymmetric() 并运行一个简单的测试,我现在会得到错误
错误:MethodError:没有方法匹配 issymmetric(::MyLinearAlgebra.LocalMatrix{Float64})
所以我很难过。显然我有一个解决方法可以让我现在继续工作,但我一定只是误解了 Julia 模块的工作原理,因为我似乎无法区分这两个函数。为什么需要显式扩展?为什么其他不能?在这种情况下,他们之间甚至有什么区别?这里扩展包模块的正确方法是什么?感谢您的帮助。
【问题讨论】:
标签: module julia linear-algebra