2016-12-17 43 views
1

我有一個顏色數組,我要轉換爲數字矩陣陣列:轉換爲轉換陣列花車

using Colors 

cols = [RGB{Float64}(rand(), rand(), rand()) for i in 1:6] 
6-element Array{ColorTypes.RGB{Float64},1}: 
RGB{Float64}(0.836012,0.505908,0.249548) 
RGB{Float64}(0.383172,0.105153,0.361422) 
RGB{Float64}(0.680616,0.974232,0.942787) 
RGB{Float64}(0.804829,0.825503,0.990222) 
RGB{Float64}(0.0404051,0.569093,0.772053) 
RGB{Float64}(0.872298,0.704112,0.473588) 

6×3 Array{Float64,2}: 
0.836012 0.505908 0.249548 
0.383172 0.105153 0.361422 
0.680616 0.974232 0.942787 
0.804829 0.825503 0.990222 
0.0404051 0.569093 0.772053 
0.872298 0.704112 0.473588 

我會怎麼做那?

回答

2

使用reinterpret。它「使用與給定數組相同的二進制數據構造一個數組,但使用指定的元素類型。」這意味着它以相同的順序讀取數據 - 並記住Julia是專欄主要的。它也不會知道返回數組應該是什麼形狀,因此默認情況下它只是一個載體:

julia> reinterpret(Float64, cols) 
18-element Array{Float64,1}: 
0.836012 
0.505908 
0.249548 
0.383172 
0.105153 
⋮ 

你可以看到它拉出浮點值,並把他們都在一個平面向量[c₁,c₂][r₁, g₁, b₁, r₂, g₂, b₂]。所以,你得先拿到3×6陣列尊重這種結構:

julia> fs = reinterpret(Float64, cols, (3, length(cols))) 
3x6 Array{Float64,2}: 
0.836012 0.383172 0.680616 0.804829 0.0404051 0.872298 
0.505908 0.105153 0.974232 0.825503 0.569093 0.704112 
0.249548 0.361422 0.942787 0.990222 0.772053 0.473588 

現在,你可以得到你想要通過採取轉置的形狀,如果你需要它:

julia> fs' 
6x3 Array{Float64,2}: 
0.836012 0.505908 0.249548 
0.383172 0.105153 0.361422 
0.680616 0.974232 0.942787 
0.804829 0.825503 0.990222 
0.0404051 0.569093 0.772053 
0.872298 0.704112 0.473588 
+0

謝謝!我總是想知道「重新解釋」是什麼 - 它看起來非常有用! – daycaster

+0

是的,它完全沒有複製數據,所以它會成爲最快的方法!但請注意,因爲這意味着修改重新解釋的數組也會影響您的'RGB'數組。 –

1

一種方法是:

[j(cols[i]) for i=1:6,j in [red,green,blue]] 
+0

'VCAT(地圖( x - > [red(x)green(x)blue(x)],cols)...)'具有相同的風味,但對於類型分析更好。基準測試顯示它比答案快。但是@Matt B的選擇可能更快。 –

+0

謝謝 - 我不知道爲什麼我沒有到達那裏...... :)正如你所說,「重新解釋」更快。 – daycaster

+0

@DanGetz是'cat(n,map(f,x)...)'「Julian」或者至少是一種很好的實現這種類似的方式?我經常使用它,但我不確定是否有更好的方法? –