使用map()添加矩阵维度

lia*_*ose 4 julia

我在 Julia 中有一个二维颜色数组

using Images

white = RGB{Float32}(1, 1, 1)
green = RGB{Float32}(0.1, 1, 0.1)
blue = RGB{Float32}(0, 0.1, 1)

A = [white white;
     green blue;
     blue blue]
Run Code Online (Sandbox Code Playgroud)

我想把每种RGB颜色变成Array{Float32, 3}更高维度的颜色。这是我尝试过的:

B = map(A) do a
  [a.r, a.g, a.b]
end

size(B) == (3, 2, 3)   # (rows, cols, channels)
# => false
Run Code Online (Sandbox Code Playgroud)

相反,B是一维数组的二维矩阵。

Julia 有类似地图的方法来扩展矩阵的维度吗?

tho*_*oly 7

你应该使用 ImageCorechannelview来代替:

\n
julia> Av = channelview(A)\n3\xc3\x973\xc3\x972 reinterpret(reshape, Float32, ::Array{RGB{Float32},2}) with eltype Float32:\n[:, :, 1] =\n 1.0  0.1  0.0\n 1.0  1.0  0.1\n 1.0  0.1  1.0\n\n[:, :, 2] =\n 1.0  0.0  0.0\n 1.0  0.1  0.1\n 1.0  1.0  1.0\n
Run Code Online (Sandbox Code Playgroud)\n

颜色通道是第一个维度(最快的维度)。您可以通过设置一些值并查看对原始值的影响来检查这一点,因为Av是 的视图A

\n
julia> Av[1,2,1] = -5\n-5\n\njulia> Av[1,2,2] = -10\n-10\n\njulia> A\n3\xc3\x972 Array{RGB{Float32},2} with eltype RGB{Float32}:\n RGB{Float32}(1.0,1.0,1.0)   RGB{Float32}(1.0,1.0,1.0)\n RGB{Float32}(-5.0,1.0,0.1)  RGB{Float32}(-10.0,0.1,1.0)\n RGB{Float32}(0.0,0.1,1.0)   RGB{Float32}(0.0,0.1,1.0)\n
Run Code Online (Sandbox Code Playgroud)\n

在这两种情况下,我们都调整了红色通道,因为用作1第一个索引。

\n

  • 如果出于某种原因您确实需要将颜色值设置为第三维,“ImageCore”还有一个“permuteddimsview”函数,其行为类似于普通的“permutedims”,但返回一个视图而不是新数组。`permuteddimsview(Av, (2, 3, 1))` 将使颜色通道数据通过第三维而不是第一维可用。 (2认同)