我希望使用索引来填充预先初始化的矩阵,其中包含用于循环输出的数组的结果:
A = Float64.(reshape(1.0:81.0,9,9))
# initialize output
B = zeros(Int64, 2, 9)
j = 1
for j in 1:size(A,2) # loop cols
out = [sum(A[:,j]),j]
out = reshape(out,2,1) # make column to append
# append out to the B
global B = hcat(B,out) # this grows...
end我初始化了B = zeros(Int64, 2, 9)
与sum操作的预期输出相同。
在我的真实世界中-我正在迭代j,列,以及,我的行-输出是一个数组.与其使用hcat()将数组附加到输出中,我还能用索引来完成吗?
在上面的代码中,它使用hcat(),然后将其附加到现有的B中,这样它就会增长。此后,我尝试了使用行2和cols 0来初始化,因此hcat()构建来纠正输出dim:
B = zeros(Int64, 2, 0)我怀疑hcat()是否具有内存效率(例如,使用全局索引的借口)--如果我不能用索引进行索引,我可以在i,j处为另一个内循环填充它。但也许有人可以将数组作为列附加到现有的预初始化输出中?
发布于 2019-05-04 14:17:21
建议是预先分配B,然后再填充它。我将代码包装在一个函数中,因为它简化了基准测试:
function f2()
A = reshape(1:81,9,9)
B = zeros(Int64, 2, 9 + size(A,2))
for j in 1:size(A,2) # loop cols
B[:, j + 9] .= (sum(view(A, :, j)), j)
end
B
end你的旧代码是:
function f1()
A = Float64.(reshape(1.0:81.0,9,9))
B = zeros(Int64, 2, 9)
j = 1
for j in 1:size(A,2) # loop cols
out = [sum(A[:,j]),j]
out = reshape(out,2,1) # make column to append
# append out to the B
B = hcat(B,out)
end
B
end下面是一个比较:
julia> @btime f1()
8.567 μs (83 allocations: 7.72 KiB)
2×18 Array{Float64,2}:
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 126.0 207.0 288.0 369.0 450.0 531.0 612.0 693.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
julia> @btime f2()
73.662 ns (1 allocation: 368 bytes)
2×18 Array{Int64,2}:
0 0 0 0 0 0 0 0 0 45 126 207 288 369 450 531 612 693
0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9你可以看到,这两者之间的差别是非常显著的。
对原始代码的一些更小的注释:
Float64.上调用reshape(1.0:81.0,9,9),对象已经保存了具有Float64值的元素。B持有Int64,A持有Float64 --我已经使其保持一致(我选择了Int64,但同样好,您可以使用Float64)。sum(A[:,j])不必要地分配了一个新对象;使用view更快reshape(out,2,1)上调用out。https://stackoverflow.com/questions/55982635
复制相似问题