我正在尝试使用单元格作为Julia函数的输入,如下所示
U = cell(2)
U[1] = zeros(3,3)
U[2] = zeros(3,3)
function f_test{S<:AbstractFloat}(U::Array{S})
a = zero(S)
return a
end
我这样做:f_test(U)
我得到了
LoadError: MethodError:
{F_TEST {1}}
当然它适用于has no method matching f_test(::Array{Any,1})
while loading In[391], in expression starting on line 10
有什么想法吗?
答案 0 :(得分:2)
在Julia中,矩阵的大小不属于其类型。所以你在这里不需要cell
。事实上,这很好用:
U = Matrix{Float64}[zeros(3, 3), zeros(3, 1)]
我们在此创建Vector
Matrix{Float64}
。 Matrix{Float64}
是Array{Float64,2}
的类型,这意味着&#34; Float64
的二维数组。 U
的类型为Array{Array{Float64,2},1}
;也就是说,它是Float64
的矩阵(二维阵列)的向量(一维阵列)。不寻常,但完全有效。
但是数组的向量与单个数组不同,因此您的函数f_test
无法在U
上运行。您似乎想要的是{em>矢量化版本的f_test
,它将该函数应用于向量的所有矩阵,并返回包含每个结果的向量。这就像sin
这样的函数目前在Julia中的工作方式(虽然将来可能会有所改变),因此函数不会自动执行此操作会令人惊讶。
我建议明确map
整个数组中的函数:
map(f_test, U) # result: [0.0, 0.0]
最清楚。如果必须对函数进行矢量化,则可以定义其他方法本身:
julia> f_test{S<:Matrix}(U::Vector{S}) = map(f_test, U)
f_test (generic function with 2 methods)
julia> f_test(U)
2-element Array{Float64,1}:
0.0
0.0
但我不建议采用这种方法。