Как сгладить 2D массив в юли? - PullRequest
2 голосов
/ 02 ноября 2019

Есть ли в julia функция, которая преобразует двумерный массив в одномерный массив? Например, я знаю, как это сделать, определив функцию, но я не хочу писать ее каждый раз.

function flatten(Mat)
n, m = size(Mat)
flattened = zeros(m*n)
for i=1:n
    for j=1:m
        flattened[(i-1)*m + j] = Mat[i,j]
    end
end
return flattened
end

Ответы [ 3 ]

5 голосов
/ 02 ноября 2019

Вы можете использовать vec (https://docs.julialang.org/en/v1/base/arrays/#Base.vec):

julia> A = rand(2, 2)                                                     
2×2 Array{Float64,2}:
 0.843062  0.164179
 0.167501  0.800111

julia> vec(A)                                                             
4-element Array{Float64,1}:
 0.8430624537022231 
 0.16750120450998196
 0.16417911360611237
 0.8001111380491013
1 голос
/ 03 ноября 2019

Другой вариант, если вы работаете в форме основного столбца, чтобы воспользоваться преимуществами упорядочения массива julia:

A = randn(10,10)
10×10 Array{Float64,2}:
a = A[:]
100-element Array{Float64,1}:

, где : последовательно помещает каждый столбец в выходной вектор.

0 голосов
/ 04 ноября 2019

Чтобы добавить к текущим решениям, Iterators.flatten делает это ленивым способом, не перемещая вещи в памяти, а определяя итератор, возвращающий элементы один за другим:

julia> A = rand(2,2)
2×2 Array{Float64,2}:
 0.667687  0.016606
 0.720289  0.12541 

julia> collect(Iterators.flatten(A))
4-element Array{Float64,1}:
 0.6676867119775669  
 0.7202889070377703  
 0.016606038041509397
 0.12540966422381583 

С готовностью вы можете использоватьза понимание показателей A:

julia> [A[i] for i in eachindex(A)]
4-element Array{Float64,1}:
 0.6676867119775669  
 0.7202889070377703  
 0.016606038041509397
 0.12540966422381583 
...