2016-12-17 45 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”或者至少是一种很好的实现这种类似的方式?我经常使用它,但我不确定是否有更好的方法? –