Julia 朱莉娅:有两种输出类型的函数不工作
我有一个函数,它接受Julia 朱莉娅:有两种输出类型的函数不工作,julia,Julia,我有一个函数,它接受Float64类型或CValue类型(这是我定义的自定义类型) 该功能的形式如下: function _Ke(T,ρ,kf,r1,r2,r3) Ke[r1] = _Ke_r1(T,ρ)*(1.0E-06) kb[r1] = _kb_r1(kf[r1],Ke[r1],ρ) Ke[r2] = _Ke_r2(T)*(1.0E-06) kb[r2] = _kb_r2(kf[r2],Ke[r2],ρ) Ke[r3] = _Ke_r3(T)*(1.
Float64
类型或CValue
类型(这是我定义的自定义类型)
该功能的形式如下:
function _Ke(T,ρ,kf,r1,r2,r3)
Ke[r1] = _Ke_r1(T,ρ)*(1.0E-06)
kb[r1] = _kb_r1(kf[r1],Ke[r1],ρ)
Ke[r2] = _Ke_r2(T)*(1.0E-06)
kb[r2] = _kb_r2(kf[r2],Ke[r2],ρ)
Ke[r3] = _Ke_r3(T)*(1.0E-06)
kb[r3] = _kb_r3(kf[r3],Ke[r3],ρ)
return Ke, Kb
end
其中kf
在本例中由one(Float64,Nr)
初始化,其中Nr=3
我正在尝试设置函数,以便它可以根据函数的输入将Ke
和kb
输出为Float64或CValue,但声明:
Ke = Vector{CValue}(undef,Nr)
kf = Vector{CValue}(undef,Nr)
在调用此函数之前,当我希望只使用Float64而不是CValue的值时,它似乎会影响函数。
删除它们会产生错误:error:LoadError:UndefVarError:Ke未定义
如何修改我的函数,使其能够无缝地接受Float64或CValue,而无需在函数中明确引用这两个值?要学究式地使用词汇。 您需要为
函数设置方法
julia
根据提供的类型在函数上分派方法
在简单的英语中,这意味着函数是具有可以调用的名称的东西。每个函数至少需要一个方法。方法是具有指定类型的函数
要在两个场景中使用一个函数,每个场景使用一种类型,您真正需要做的是写下函数两次。
每种类型一次
为了澄清这一点,最好在参数列表的开头或结尾写下您分派的主要类型。我只是把它放在最后
function _Ke(T,ρ,r1,r2,r3,kf::CValue)
return kF*foo
end
function _Ke(T,ρ,r1,r2,r3,kf::Float64)
return kF*foo
end
我假设您的目标是让输入参数的类型决定输出类型。我还假设CValue是一种浮点数;但是,如果不是这样,您可以删除或修改“where”条款以满足您的需要
您可以通过以下方式执行此操作:
function foo(a::T) where {T<: AbstractFloat}
return Vector{T}(undef, 5)
end
# here is how your type could be defined:
struct CValue <: AbstractFloat
c::Int64
v::Int64
end
#and you could call your function in these ways:
foo(3.)
foo(CValue(2,4))
函数foo(a::T)其中{TCan您可以澄清一下:Ke
和Kf
是否可以同时包含Float64
和CValue
,或者是一个还是另一个?输出类型依赖于什么,它们依赖于输入值还是输入类型?因此,我使用了两组变量:bkb、bkf和bKe是Float64 kb类型,Kf和Ke是Float64 kb类型C值它们将是一个或另一个。抛出错误的原因是您试图更改Ke
和Kf
的内容,但它们不会出现在参数中。如果这些是全局变量,则将它们作为第一个参数放入,并明确表示您将更改它们(Julia约定使用bang(!
)在函数名的末尾)。什么是bkb
,bkf
,bKe
?它们不会出现在您的代码示例中。到目前为止,我避免编写重复的函数。当我明确定义Ke和kb数组中的值时,该函数通常会工作,即编写Ke_
,而不是Ke>[r1]
,并让函数返回一长行Ke
和kb
值,这是我试图避免的