如何在一个循环中创建变长的数组?


#1

下边是截取的一部分代码,while循环的第二行是自己尝试用表达式的方法来创建一个变长的array,但是这样做我用@benchmark 测试的时候就会死循环,用@time没有问题,感觉是表达式影响了@benchmark中的某个变量? 不知道有没有正确的或者说比较好的方法来达到创建变长数组的效果,也感觉我的想法不够julia,好的想法应该怎么做呢?

function romberg(f::integral_function, ε::Float64)
    k = 1
    len = f.ub - f.lb
    T_k = [(f.ub - f.lb) / 2. * (calculate(f, f.lb) + calculate(f, f.ub))]
    println(T_k)
    while true
        x = f.lb:(len/2.):f.ub
        T_k1 = eval(:(zeros($(k)+1)))
        T_k1[1] = T_k[1] / 2.
        for i=2:2:length(x)
            T_k1[1] += len / 2. * calculate(f, x[i])
        end
        for i=2:(k+1)
            T_k1[i] = 4^k / (4^k - 1) * T_k1[i-1] - 1 / (4^k - 1) * T_k[i-1]
        end
        # println(T_k1)
        if abs(T_k1[k + 1] - T_k[k]) < ε
            return T_k1[k + 1]
        end
        T_k = T_k1
        k += 1
        len /= 2.
    end
end

完整的程序在这里 https://github.com/LDNN97/ToyBox.jl/blob/master/src/romberg.jl


#2

我感觉 julia 可能没有定长的数组。。。
要塞东西就一直 push! or append! 就好了。

arr = Vector{Float64}() # 空数组
# arr = zeros(1) # 有 1 个 `0.0` 的数组

push!(arr, 0.0)
append!(arr, [1.0*i for i in 1:10])
julia> arr = Vector{Float64}() # 空数组
0-element Array{Float64,1}

julia> push!(arr, 0.0)
1-element Array{Float64,1}:
 0.0

julia> append!(arr, [1.0*i for i in 1:10])
11-element Array{Float64,1}:
  0.0
  1.0
  2.0
  3.0
  4.0
  5.0
  6.0
  7.0
  8.0
  9.0
 10.0

#3

啊,可以这样呀 :man_facepalming:t2: ,又涨知识了,谢谢你


#4

定长数组在StaticArrays里


#5

补充连接


#6

您好,如果我想向一个变长的三维数组里面去塞变长的二维数组可以不可以呢?


#7

新加入的二维数组 mxn 都相同才可以叠加,不知道算不算变长。

julia> arr = cat([1 2 ;3 4], [5 6 ; 7 8]; dims=3)
2×2×2 Array{Int64,3}:
[:, :, 1] =
 1  2
 3  4

[:, :, 2] =
 5  6
 7  8

julia> cat(arr, [7 8; 9 10], dims=3)
2×2×3 Array{Int64,3}:
[:, :, 1] =
 1  2
 3  4

[:, :, 2] =
 5  6
 7  8

[:, :, 3] =
 7   8
 9  10

#8

变长的接口只对一维的Vector有(变长高维数组的需求本身也太少了,而且理论上性能可以很差),但是你可以reshape一下然后增加长度,因为reshape的ReshapedArray和原来的Array是share memory的。