复制数组列

时间:2016-03-23 17:55:05

标签: julia

我有一个算法,需要将一个数组的一列替换为同一个数组的另一列。 我尝试用切片和元素来做。

const M = 10^4
const N = 10^4
A = rand(Float32, M, N)
B = rand(Float32, N, M)

function copy_col!(A::Array{Float32,2},col1::Int,col2::Int)
  A[1:end,col2] = A[1:end,col1]
end

function copy_col2!(A::Array{Float32,2},col1::Int,col2::Int)
  for i in 1:size(A,1)
    A[i,col2] = A[i,col1]
  end
end

[Both functions+rand are called here once for compilation]

@time (for i in 1:20000 copy_col!(B, rand(1:size(B,2)),rand(1:size(B,2)) ); end )
@time (for i in 1:20000 copy_col2!(B, rand(1:size(B,2)),rand(1:size(B,2)) ); end )

>>  0.607899 seconds (314.81 k allocations: 769.879 MB, 25.05% gc time)
>>  0.213387 seconds (117.96 k allocations: 2.410 MB)

为什么使用切片复制会更糟糕?有没有比copy_col2!做得更好的方式?

1 个答案:

答案 0 :(得分:7)

app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); 首先制作索引列的副本,然后将其复制到A[1:end,col1],以便A[1:end,col2]分配更多并运行更长时间。在这种情况下,copy_col!subslice可以补救分配。