gpt4 book ai didi

julia - 如何创建可以在矩阵数学中使用的Point类型

转载 作者:行者123 更新时间:2023-12-01 09:28:26 26 4
gpt4 key购买 nike

我想用成员Point2Dx创建一个复合类型y,这很容易。但是,我希望它使用non-Point2D参与正常的数学函数。例如,Point2D(1,2) + [1,1]应该导致Vector{Int64}的值为[2,3]

我基于When is Julia's convert() used?创建了convertpromote_rule函数,但随后意识到我的类型需要是convert ed的某种子类型。但是,当我尝试从VectorVector{T}或任何类型的ArrayAbstractArray进行子类型化以尝试使我的类型参与转换时,我得到ERROR: invalid subtyping in definition of Point2D。如果作为实验,我将类型设为Number的子类型,例如type Point2D{T} <: Number,那么至少文件加载没有错误,但是,当我尝试Point2D(1,2) + [1,1]时,我当然会得到ERROR: no promotion exists for GridCalc.Point2D{Int64} and Int64

我也尝试将Point2D改为mutable struct,但也不会“采用” <: Vector{T}

这是代码:

type Point2D{T}  # Fails when I add <: Vector{T}, etc.
x::T
y::T
end

# Convert a Point2D to a vector of the same type
convert{T1, T2<:Vector{T1}}(::Type{T2}, p::Point2D{T1}) = [p.x, p.y]

# Choose Vector when given the option
promote_rule{T1<:Real, T2<:Point2D{T1}, T3<:Vector{T1}}(::Type{T2}, ::Type{T3}) = T3

问题:
  • 这是让Point2D像2个矢量一样参与数学函数的正确方法吗?
  • 如何获取Point2D作为Vector{T}的子类型
  • 最佳答案

    做到这一点的方法是子类型AbstractVector{T}。在Julia中,您只能将抽象类型作为子类型。 Vector{T}是一种具体类型。您还必须实现一些必需的方法。有关更多详细信息,请参见interfaces chapter:

    julia> type Point2D{T} <: AbstractVector{T}
    x::T
    y::T
    end
    Base.getindex(p::Point2D, i::Int) = getfield(p, i)
    Base.size(::Point2D) = (2,)

    julia> Point2D(1,2)
    2-element Point2D{Int64}:
    1
    2

    julia> [1 2; 3 4; 5 6] * Point2D(1,2)
    3-element Array{Int64,1}:
    5
    11
    17

    您还可以查看(和/或使用) JuliaGeometry organizationGeometryTypes.jl的点定义和周围方法。

    关于julia - 如何创建可以在矩阵数学中使用的Point类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45135765/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com