Julia 如何从正则矩阵继承
您的矩阵类型被定义为AbstractArray{T,2}的子类型。您需要在Julia的非正式数组接口中为您的类型实现一些方法,以使在AbstractArray{T,2}上工作的函数和特性也能在您的自定义类型上工作,也就是说,使您的CircularMatrix成为一个可迭代、可索引、完全运行的矩阵 实现方法如下: 循环矩阵 getindexM::CircularMatrix,i::Int getindexM::CircularMatrix,I::Vararg{Int,N} 集合索引!M::循环矩阵,v,i::Int 集合索引!M::CircularMatrix,v,I::Vararg{Int,N} 您已经实现了1、2和4,但尚未设置索引样式。如果您愿意,您可能不需要3和5。您只需要将IndexStyle设置为IndexLinear,并进行一些修改,然后所有内容都应该适用于您的矩阵 1.循环矩阵 第一个是尺寸。sizeA::CircularMatrix返回a的维度元组。我相信对于您的矩阵,可能类似于以下内容Julia 如何从正则矩阵继承,julia,Julia,您的矩阵类型被定义为AbstractArray{T,2}的子类型。您需要在Julia的非正式数组接口中为您的类型实现一些方法,以使在AbstractArray{T,2}上工作的函数和特性也能在您的自定义类型上工作,也就是说,使您的CircularMatrix成为一个可迭代、可索引、完全运行的矩阵 实现方法如下: 循环矩阵 getindexM::CircularMatrix,i::Int getindexM::CircularMatrix,I::Vararg{Int,N} 集合索引!M::循环矩阵
m = CircularMatrix{Int}(4,4)
m[1, 1] = 5
x = view(m, 1, :)
Base.IndexStyle(::Type{<:CircularMatrix}) = IndexLinear()
Base.@propogate_inbounds function Base.getindex(M::CircularMatrix, i::Int)
@boundscheck checkbounds(M, i)
@inbounds M.view[i]
end
2.getindexM::CircularMatrix,i::Int
如果选择线性索引样式,则需要此方法。getindexM,i::Int应该给出线性索引i处的值。您已经在代码中实现了它。如果选择线性索引,则需要为类型设置IndexStyle,然后只需跳过3和5即可。Julia将自动将多个索引访问(例如a[3,5])转换为线性索引访问
Base.size(M::CircularMatrix) = size(M.data)
或者,因为维度不是参数化的,矩阵是二维的,所以
Base.@propogate_inbounds function Base.getindex(A::CircularMatrix, I::Vararg{Int, 2})
@boundscheck checkbounds(A, I...)
@inbounds A.view[# convert I[1]` and `I[2]` to a linear index in `view`]
end
4.集合索引!M::循环矩阵,v,i::Int
第四个类似于第二个。如果选择线性索引样式,此方法应将值设置为线性索引i
5.集合索引!M::CircularMatrix,v,I::Vararg{Int,N}
如果选择笛卡尔索引样式,则第五个索引应该与第三个类似
在1、2和4的实现以及设置IndexStyle之后,您应该有一个可以正常工作的自定义矩阵类型
Base.@propogate_inbounds function Base.getindex(A::CircularMatrix, i::Int, j::Int)
@boundscheck checkbounds(A, i, j)
@inbounds A.view[# convert i` and `j` to a linear index in `view`]
end
这些都应该有效
几点注意事项
有一个关于抽象数组接口的文档和一些示例。您还可以看到要实现的可选方法
GitHub上有一个组织提供了许多有用的自定义数组实现,包括StaticArray、OffsetArray等,还有一个组织提供自定义矩阵类型。您可能想看看它们的实现
@如果使用Base,则inline是多余的。@propogate_inbounds
@在边界内传播
告诉编译器内联函数,同时保留调用方的
边界内的上下文
您不需要为矩阵定义eltype,因为已经有了返回T的AbstractArray{T,N}的定义。
您的矩阵类型被定义为AbstractArray{T,2}的子类型。您需要在Julia的非正式数组接口中为您的类型实现一些方法,以使在AbstractArray{T,2}上工作的函数和特性也能在您的自定义类型上工作,也就是说,使您的CircularMatrix成为一个可迭代、可索引、完全运行的矩阵 实现方法如下: 循环矩阵 getindexM::CircularMatrix,i::Int getindexM::CircularMatrix,I::Vararg{Int,N} 集合索引!M::循环矩阵,v,i::Int 集合索引!M::CircularMatrix,v,I::Vararg{Int,N} 您已经实现了1、2和4,但尚未设置索引样式。如果您愿意,您可能不需要3和5。您只需要将IndexStyle设置为IndexLinear,并进行一些修改,然后所有内容都应该适用于您的矩阵 1.循环矩阵 第一个是尺寸。sizeA::CircularMatrix返回a的维度元组。我相信对于您的矩阵,可能类似于以下内容
m = CircularMatrix{Int}(4,4)
m[1, 1] = 5
x = view(m, 1, :)
Base.IndexStyle(::Type{<:CircularMatrix}) = IndexLinear()
Base.@propogate_inbounds function Base.getindex(M::CircularMatrix, i::Int)
@boundscheck checkbounds(M, i)
@inbounds M.view[i]
end
2.getindexM::CircularMatrix,i::Int
如果选择线性索引样式,则需要此方法。getindexM,i::Int应该给出线性索引i处的值。您已经在代码中实现了它。如果选择线性索引,则需要为类型设置IndexStyle,然后只需跳过3和5即可。Julia将自动将多个索引访问(例如a[3,5])转换为线性索引访问
Base.size(M::CircularMatrix) = size(M.data)
或者,因为维度不是参数化的,矩阵是二维的,所以
Base.@propogate_inbounds function Base.getindex(A::CircularMatrix, I::Vararg{Int, 2})
@boundscheck checkbounds(A, I...)
@inbounds A.view[# convert I[1]` and `I[2]` to a linear index in `view`]
end
4.集合索引!M::循环矩阵,v,i::Int
第四个类似于第二个。如果选择线性索引样式,此方法应将值设置为线性索引i
5.集合索引!M::CircularMatrix,v,I::Vararg{Int,N}
如果选择笛卡尔索引样式,则第五个索引应该与第三个类似
在1、2和4的实现以及设置IndexStyle之后,您应该有一个可以正常工作的自定义矩阵类型
Base.@propogate_inbounds function Base.getindex(A::CircularMatrix, i::Int, j::Int)
@boundscheck checkbounds(A, i, j)
@inbounds A.view[# convert i` and `j` to a linear index in `view`]
end
这些都应该有效
几点注意事项
有一个关于抽象数组接口的文档和一些示例。您还可以看到要实现的可选方法
GitHub上有一个组织提供了很多有用的自定义数组实现,包括StaticArray,当然
fsetarray等,以及提供自定义矩阵类型的组织。您可能想看看它们的实现
@如果使用Base,则inline是多余的。@propogate_inbounds
@在边界内传播
告诉编译器内联函数,同时保留调用方的
边界内的上下文
您不需要为矩阵定义eltype,因为已经有了返回T的AbstractArray{T,N}的定义。
真棒的回答,伙计。非常感谢。真棒的回答,伙计。非常感谢。