gpt4 book ai didi

julia - 将可变长度 MVector 的异构元组推广到可变数量的 MVector

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

有没有办法创建一个参数类型,它表示一个可变长度的异构元组,其中元组的每个元素都是一个 MVector,这样 MVector 可以具有不同的长度,但它们包含相同的数字类型。所以在伪代码中,我想要这样的东西:

using StaticArrays

struct MyType{T, N1, N2, N3, ...}
data::Tuple{MVector{N1, T}, MVector{N2, T}, MVector{N3, T}, ...}
end

我当然可以制作更具体的类型,例如:
struct MyType3{T, N1, N2, N3}
data::Tuple{MVector{N1, T}, MVector{N2, T}, MVector{N3, T}}
end

但我想推广到任意长度的元组。

最佳答案

如果您不需要“可变类型参数”N1 ... Nk明确地,您可以使用 Vararg 的元组一些 UnionAll类型:

julia> MyType3{T} = Tuple{Vararg{MVector{M, <:T} where M}}
Tuple{Vararg{MArray{Tuple{M},#s14,1,M} where #s14<:T where M,N} where N} where T

julia> (MVector{2}([1,2]), MVector{3}([1,2,3])) isa MyType3{Int}
true

julia> (MVector{2}([1,2]), MVector{3}([1,2,3])) isa MyType3{Number}
true

julia> (MVector{2}([1,2]), MVector{3}([1,2,3])) isa MyType3{String}
false

julia> (MVector{2}([1,2]), MVector{3}([1,2,3])) isa MyType3
true

julia> (MVector{2}(["a", "b"]), MVector{3}([1,2,3])) isa MyType3
true

或者像这样,您有一个显式的大小类型元组:
julia> struct MyType7{T, Ns<:Tuple, D}
data::D
function MyType7(vecs::Vararg{MVector{M, T} where M}) where {T}
Ns = [typeof(v).parameters[4] for v in vecs]
new{T, Tuple{Ns...}, typeof(vecs)}(vecs)
end
end

julia> MyType7(MVector{2}([1,2]), MVector{3}([1,2,3]))
MyType7{Int64,Tuple{2,3},Tuple{MArray{Tuple{2},Int64,1,2},MArray{Tuple{3},Int64,1,3}}}(([1, 2], [1, 2, 3]))

julia> typeof(ans)
MyType7{Int64,Tuple{2,3},Tuple{MArray{Tuple{2},Int64,1,2},MArray{Tuple{3},Int64,1,3}}}

但这现在是一种黑客攻击,因为我们使用 parameters在运行时反射(reflect)类型参数。如果你使用这个变体,一定要知道你在做什么(我不会说我自己),并对其进行基准测试(或者让它成为 @generate d?)。

关于julia - 将可变长度 MVector 的异构元组推广到可变数量的 MVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59785665/

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