作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过扩展 LinearAlgebra
中存在的功能来创建自定义矩阵库。模块。我一直在通过在自定义 MyLinearAlgebra
中创建自定义结构来做到这一点。直接导入默认线性代数结构并覆盖许多常见 LA 功能的模块。我的问题特别是关于如何覆盖反斜杠函数。这是我的"MyLinearAlgebra.jl"
:
module MyLinearAlgebra
import LinearAlgebra
import Base: getindex, setindex!, size
export
# Types
LocalMatrix,
SolutionVector,
# Functions
lp_error!,
lp_norm,
true_size
include("SolutionVector.jl")
include("LocalMatrix.jl")
end
只关注
LocalMatrix.jl
我现在有:
"""
struct LocalMatrix{T} <: AbstractMatrix{T}
Block diagonal structure for local matrix. `A[:,:,iS,iK]` is a block matrix for
state iS and element iK
"""
struct LocalMatrix{T} <: AbstractMatrix{T}
data::Array{T,4}
factorizations::Array{Any,2}
function LocalMatrix(data::Array{T,4}) where {T}
new{T}(data,Array{Any}(undef, size(data,3), size(data,4)))
end
end
# [... a lot of things that are already working including: ldiv!]
"""
ldiv!(A::LocalMatrix, x::SolutionVector)
In-place linear solve A\\x using block-diagonal LU factorizations. Compute this
block-diagonal factorization if not yet computed.
"""
function LinearAlgebra.ldiv!(A::LocalMatrix, x::SolutionVector)
println("my ldiv! works fine")
x
end
# [ ... and yet this does not work ]
"""
A::LocalMatrix \\ x::SolutionVector
Linear solve A\\x using block-diagonal LU factorizations. Compute this
block-diagonal factorization if not yet computed.
"""
function (\)(A::LocalMatrix, x::SolutionVector)
println("my \\ never prints out in any tests")
(m,n,ns,ne) = size(A.data)
(nx,nsx,nex) = size(x.data)
@assert n == nx && ne == nex && m == n
b = deepcopy(x)
LinearAlgebra.ldiv!(A, b)
end
在我的测试中,我可以使用
ldiv!
功能完全符合预期,但我无法使用
\
功能 - 它只是使用在其他地方编写的一些标准实现。我相信这大概是因为我的反斜杠函数不符合 LinearAlgebra 反斜杠函数的条件,但我不确定。试图将函数限定为
LinearAlgebra.(\)(A::LocalMatrix, x::SolutionVector)
失败并出现语法错误
invalid function name
.有没有另一种方法可以做到这一点,或者我在这里错过了关于模块的更基本的东西?
最佳答案
\
在 Base 中定义,因此:
julia> "a" \ "b"
ERROR: MethodError: no method matching adjoint(::String)
julia> Base.:\(::String, ::String) = "hello"
julia> "a" \ "b"
"hello"
但是,由于它被导入到
LinearAlgebra
以下也适用于我(我正在使用新 session ):
julia> using LinearAlgebra
julia> "a" \ "b"
ERROR: MethodError: no method matching adjoint(::String)
julia> LinearAlgebra.:\(::String, ::String) = "hello"
julia> "a" \ "b"
"hello"
因为 Julia 会向同一个函数(在 Base 中定义)添加一个方法。
关于module - 覆盖自定义 Julia 结构的反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63571165/
我是一名优秀的程序员,十分优秀!