Проблема с Array в структуре на языке Julia

У меня проблема со следующей структурой:

struct OdeSol{typ, rng, n}
    t::rng
    x::Array{typ}
    v::Array{typ}
end

OdeSol(typ, rng, n) = OdeSol(rng, Array{typ}(undef, n, length(rng)), Array{typ}(undef, n, length(rng)))

где t_range=tlim[1]:Δt:tlim[2], typeof(x0[1]) — это Float64, а size(x0)[1] — целое число (size(x0)[1]=2).

Когда я запускаю sol = OdeSol(typeof(x0[1]), t_range, size(x0)[1]), я получаю следующую ошибку:

MethodError: no method matching Array{0.0:0.01:10.0,N} where N(::UndefInitializer, ::Array{Float64,2}, ::Int64)
Closest candidates are:
  Array{0.0:0.01:10.0,N} where N(::UndefInitializer, !Matched::Int64, ::Int64) where T at boot.jl:421
  Array{0.0:0.01:10.0,N} where N(::UndefInitializer, !Matched::Int64, ::Int64, !Matched::Int64) where T at boot.jl:422
  Array{0.0:0.01:10.0,N} where N(::UndefInitializer, !Matched::Integer, ::Integer) where T at baseext.jl:17
  ...

Stacktrace:
 [1] OdeSol(::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Array{Float64,2}, ::Array{Float64,2}) at ./In[10]:8 (repeats 2 times)
 [2] top-level scope at In[11]:1
 [3] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091

Кто-нибудь может мне помочь?

Ваша ошибка не соответствует тому, что вы утверждаете. Вы передаете диапазон как top, матрицу как rng и матрицу как ваш n. Ни один из этих типов не соответствует тому, с чем вы его называете. Это вообще не имеет ничего общего с определением struct; сделайте шаг назад и убедитесь, что вы знаете, что такое каждый аргумент.

mbauman 10.12.2020 19:57

Вы также действительно хотите, чтобы эти аннотации типа Array были Vector, иначе тип поля будет абстрактным, поскольку количество измерений не указано.

StefanKarpinski 10.12.2020 20:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
143
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы смешиваете параметрические типы со значениями полей в struct. Кроме того, стоит использовать заглавные буквы для имен типов. Глядя на параметры, также кажется, что вы ищете матрицы (то есть двумерные массивы)/

Возможно, вы имеете в виду следующее:

struct OdeSol{T, R}
    t::R
    x::Matrix{T}
    v::Matrix{T}
end

OdeSol{T,R}(rng::R, n) where {T,R} = OdeSol{T,R}(rng, Matrix{T}(undef, n, length(rng)), Matrix{T}(undef, n, length(rng)))

А теперь пример использования:

julia> OdeSol{Int, Vector{Int}}([1,2,3],4)
OdeSol{Int64,Array{Int64,1}}([1, 2, 3], [0 0 0; 0 0 0; 0 0 0; 0 0 0], [0 0 0; 0 0 0; 0 0 0; 0 0 0])

Другие вопросы по теме