首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >朱莉娅:如何最优地声明包含插值的向量?

朱莉娅:如何最优地声明包含插值的向量?
EN

Stack Overflow用户
提问于 2021-04-11 13:52:32
回答 2查看 264关注 0票数 2

我是一名经济学专业的学生,慢慢地从MATLAB转到朱莉娅。

目前,我的问题是,我不知道如何声明(预先分配)一个向量,可以存储插值。

具体来说,当我执行一些接近:

代码语言:javascript
复制
function MyFunction(i)
    # x, y vectors are some functions of 'i' defined here 
    f = LinearInterpolation(x,y,extrapolation_bc=Line())
    return f
end    

g = Vector{Function}(undef, N)
    
for i = 1:N
    g[i] = MyFunction(i)
end

我得到:

代码语言:javascript
复制
ERROR: LoadError: MethodError: Cannot `convert` an object of type Interpolations.Extrapolation{Float64,1,Interpolations.GriddedInterpolation{Float64,1,Float64,Gridded{Linear},Tuple{Array{Float64,1}}},Gridded{Linear},Line{Nothing}} to an object of type Function

如果我而不是g=Vector{Function}(undef, N)声明g=zeros(N),我会得到类似的错误消息(以...Float64而不是... Function结尾)。

相反,当我宣布:

代码语言:javascript
复制
g = Interpolations.Extrapolation{Float64,1,Interpolations.GriddedInterpolation{Float64,1,Float64,Gridded{Linear},Tuple{Array{Float64,1}}},Gridded{Linear},Line{Nothing}}(N)

我得到:

代码语言:javascript
复制
LoadError: MethodError: no method matching Interpolations.Extrapolation{Float64,1,Interpolations.GriddedInterpolation{Float64,1,Float64,Gridded{Linear},Tuple{Array{Float64,1}}},Gridded{Linear},Line{Nothing}}(::Int64) Closest candidates are: Interpolations.Extrapolation{Float64,1,Interpolations.GriddedInterpolation{Float64,1,Float64,Gridded{Linear},Tuple{Array{Float64,1}}},Gridded{Linear},Line{Nothing}}(::Any, !Matched::Any) where {T, N, ITPT, IT, ET}

当我根本不声明"g“的时候,我就会得到:

代码语言:javascript
复制
ERROR: LoadError: UndefVarError: g not defined

最后,当我宣布:

代码语言:javascript
复制
g = Vector{Any}(undef, N)

代码可以工作,但我担心这可能会导致变量g的某些类型更改,从而降低性能敏感代码。

那么,在这种情况下,我应该如何声明g呢?

编辑:在现实中,我的问题有点复杂,更像以下所示:

代码语言:javascript
复制
function MyFunction(i)
# x, y vectors are some functions of 'i' defined here        
f = LinearInterpolation(x,y,extrapolation_bc=Line())
h = is a T-vector of some functions of x,y
A = is some matrix depending on x,y
    return h, A, f
end
 
h = Matrix{Function}(undef, T, N)
A = zeros(T,I,N)
g = Vector{Any}(undef, N)

for i = 1:N
    h[:,i], A[:,:,i], g[i] = MyFunction(i)
end

因此,当我使用理解或广播(如h, A, g = [MyFunction(i) for i in 1:N]h, A, g = MyFunction.(1:N))时,如用户Benoit和DNS所建议的,我的函数的输出是3个元组,h,A,g,每个元组都包含{hi,Ai,gi}用于i=1,2,3。如果在LHS上只使用一个输出变量,即:MyOutput = [MyFunction(i) for i in 1:N]MyOutput[i] = MyFunction.(1:N),则MyOutput成为一个包含N个元组条目的向量,每个元组都由{hi,Ai} i=1,2,3,.我敢打赌,有一种方法可以从MyOutput中的元组中提取这些元素,并将它们填充到h[:,i], A[:,:,i], g[i]中,但这似乎有点麻烦和缓慢。

EN

回答 2

Stack Overflow用户

发布于 2021-04-11 14:31:16

你可以

代码语言:javascript
复制
f = MyFunction(1)
g = Vector{typeof(f)}(undef, N)
g[1] = f
    
for i = 2:N
    g[i] = MyFunction(i)
end

我认为map也应该找出以下类型:

代码语言:javascript
复制
map(MyFunction, 1:N)
票数 3
EN

Stack Overflow用户

发布于 2021-04-12 00:46:08

一个简单的解决方案是使用理解

代码语言:javascript
复制
g = [MyFunction(i) for i in 1:N]

或者优雅地使用点语法

代码语言:javascript
复制
g = MyFunction.(1:N)

(注释中提出的点语法解决方案归功于DNF。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67045776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档