2013-01-20 26 views
18

Cách hiệu quả nhất để chuyển đổi Ma trận {T} có kích thước 1 * N hoặc N * 1 trong Julia thành Vector {T} là gì?Cách hiệu quả nhất để chuyển đổi Ma trận {T} có kích thước 1 * N hoặc N * 1 trong Julia thành Vector {T} là gì?

Ví dụ, nói rằng tôi có

a = [1,3,5] 
b = a' 

Cả ab là loại Array{Int,2} (ví dụ: Matrix{Int}). Cách hiệu quả nhất để chuyển đổi ab là gì để nhập Array{Int,1} (ví dụ: Vector{Int})?

Một cách tiếp cận là:

a_vec = [x::Int for x in a] 
b_vec = [x::Int for x in b] 

Trả lời

27

Bạn có thể sử dụng chức năng vec(). Đó là nhanh hơn so với hiểu danh sách và quy mô tốt hơn với số lượng của các nguyên tố;) Đối với một ma trận của 1000x1:

julia> const a = reshape([1:1000],1000,1); 

julia> typeof(a) 
Array{Int64,2} 

julia> vec_a = [x::Int for x in a]; 

julia> typeof(vec_a) 
Array{Int64,1} 

julia> vec_aII = vec(a); 

julia> typeof(vec_aII) 
Array{Int64,1} 

6.41e-6 giây # danh sách hiểu

2.92e-7 giây # vec ()

+12

Một điều quan trọng cần lưu ý về cả hai 'vec' và' reshape' là họ chia sẻ bộ nhớ với các mảng cơ bản để thực hiện - đó là lý do tại sao 'vec' rất nhanh hơn nhiều hơn là hiểu, tạo ra một đối tượng mảng mới, sao chép nội dung. Do đó, nếu bạn thay đổi 'a [1]', 'v_aII [1]' cũng sẽ thay đổi và ngược lại, trong khi 'v_a [1]' sẽ không bị ảnh hưởng. – StefanKarpinski

3

tôi sẽ có xu hướng sử dụng squeeze để làm điều này nếu ma trận là 1xN hoặc Nx1:

squeeze(ones(3, 1)) 
squeeze(ones(1, 3)) 

Không chắc chắn rằng điều đó hiệu quả hơn là sử dụng vec hoặc reshape.

+0

Tốt, tôi không biết về chức năng này. –

+1

Nhìn thấy trong các định nghĩa, có vẻ như squeeze phải chậm hơn một chút so với cái kia. https://github.com/JuliaLang/julia/blob/master/base/abstractarray.jl#L152 tôi làm một chuẩn mực ít, và tôi thấy: bóp (m): (2,97 + - 2) e-6 giây vec (m): (2.02 + - 2) e-6 giây định hình lại (m, chiều dài (m)): (1,72 + - 2) e-6 giây Sự khác biệt rất nhỏ , nhưng làm thế nào người ta có thể mong đợi bằng các định nghĩa, định hình lại (m, chiều dài (m)) là tùy chọn nhanh hơn. –

1

vec() là nhanh hơn

const a = reshape([1:1000],1000,1); 
@time vec(a); 
elapsed time: 6.914e-6 seconds (184 bytes allocated) 
@time squeeze(a,2); 
elapsed time: 1.0336e-5 seconds (248 bytes allocated) 
Các vấn đề liên quan