如何使用“单元格”作为Julia函数的输入

时间:2016-06-02 17:12:23

标签: julia

我正在尝试使用单元格作为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

有什么想法吗?

1 个答案:

答案 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

但我不建议采用这种方法。