2017-04-03 21 views
2

淺拷貝數組我有一個數組a,我需要淺拷貝到一個數組b。 我應該使用我應該使用收集或陣列在Julia

b = collect(a) 

b = Array(a) 

,哪些是使用一種或另一種的區別是什麼?

+1

可能類似於http://stackoverflow.com/questions/35115414/copy-or-clone-a-collection-in-julia –

+0

是的,這是類似的,但沒有解決的優點/缺點'copy' wrt'collect'和'Array',用於數組的特定情況。 – eguaio

回答

6

copy是什麼您要找的:b = copy(a)

確實,您也可以使用collectArray來完成這項工作,但有什麼不同?在Julia中,有許多方便的助手函數/宏可以用來挖掘引擎蓋下發生的事情。

@which@edit@less經常用於確定哪個方法被調用的源代碼:

julia> a = rand(3,3) 
julia> @which collect(a) 
collect(itr) at array.jl:273 

julia> @which Array(a) 
(::Type{T}){T}(arg) at sysimg.jl:53 

julia> @less collect(a) 
collect(itr) = _collect(1:1 #= Array =#, itr, iteratoreltype(itr), iteratorsize(itr)) 
... 
... 

julia> @less Array(a) 
(::Type{T}){T}(arg) = convert(T, arg)::T 
... 
... 

在這裏,代碼告訴collect視爲a(陣列)作爲一個迭代,然後做了一些迭代操縱的東西,而不是隻有淺拷貝。如果您想深入瞭解代碼,我推薦使用Julia的調試軟件包Gallium.jlArray(a)只做了一個比collect好的轉換,但也沒有必要。對於copy的代碼實際上是非常低的水平:

copy{T<:Array}(a::T) = ccall(:jl_array_copy, Ref{T}, (Any,), a) 

另一種強大的工具,是@code_xxx宏:

julia> @code_ 
@code_llvm  @code_lowered @code_native @code_typed  @code_warntype 

例如,你可以檢索和比較LLVM-IR代碼來觀察的差異:因爲它不僅僅是一個簡單的複製更

julia> @code_llvm Array(a) 

define %jl_value_t* @julia_Type_73446(%jl_value_t*, %jl_value_t**, i32) #0 { 
top: 
    %3 = alloca %jl_value_t**, align 8 
    store volatile %jl_value_t** %1, %jl_value_t*** %3, align 8 
    %4 = load %jl_value_t*, %jl_value_t** %1, align 8 
    ret %jl_value_t* %4 
} 

julia> @code_llvm copy(a) 

define %jl_value_t* @julia_copy_73507(%jl_value_t*) #0 { 
top: 
    %1 = call %jl_value_t* inttoptr (i64 4478340144 to %jl_value_t* (%jl_value_t*)*)(%jl_value_t* %0) 
    ret %jl_value_t* %1 
} 

@code_llvm collect(a)將返回一串代碼。我不熟悉LLVM,所以我不能說更多。

+0

太棒了!不知道「copy」的存在。當你複製一個數組時,你能否提一下'collect','Array'和'copy'之間的區別。看來結果是一樣的。也許,收集效率較低,因爲它會創建數組迭代而不是一次複製所有內容? – eguaio

+0

@eguaio是的,在這種情況下(做一個淺拷貝),'collect'做了更多不必要的工作來操縱迭代的東西。 – Gnimuc

+1

如果你想複製到一個預先存在的數組'b',這個問題似乎暗示着,使用'copy!'而不是'copy'。 – DNF

3

copy是正確的!

help?> copy 
search: copy copy! copysign deepcopy unsafe_copy! cospi complex Complex Complex64 Complex32 Complex128 CompositeException 

    copy(x) 

    Create a shallow copy of x: the outer structure is copied, but not all internal values. For example, copying an array 
    produces a new array with identically-same elements as the original. 
相關問題