Julia 如何从正则矩阵继承

Julia 如何从正则矩阵继承,julia,Julia,您的矩阵类型被定义为AbstractArray{T,2}的子类型。您需要在Julia的非正式数组接口中为您的类型实现一些方法,以使在AbstractArray{T,2}上工作的函数和特性也能在您的自定义类型上工作,也就是说,使您的CircularMatrix成为一个可迭代、可索引、完全运行的矩阵 实现方法如下: 循环矩阵 getindexM::CircularMatrix,i::Int getindexM::CircularMatrix,I::Vararg{Int,N} 集合索引!M::循环矩阵

您的矩阵类型被定义为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、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}的定义。
真棒的回答,伙计。非常感谢。真棒的回答,伙计。非常感谢。