在Julia中将Array {Array {Float64,1},1}转换为Array {Float64,2}

Dim*_*iev 3 arrays julia

我的问题类似于前面描述的问题,不同之处在于我没有手动输入数字.因此,那里接受的答案对我不起作用.

我想将笛卡尔坐标向量转换为极坐标:

function cart2pol(x0,
                  x1)
    rho = sqrt(x0^2 + x1^2)
    phi = atan2(x1, x0)
    return [rho, phi]
end

@vectorize_2arg Number cart2pol

function cart2pol(x)
    x1 = view(x,:,1)
    x2 = view(x,:,2)
    return cart2pol(x1, x2)
end



x = rand(5,2)

vcat(cart2pol(x))
Run Code Online (Sandbox Code Playgroud)

最后一个命令由于某种原因不收集数组,返回类型的输出5-element Array{Array{Float64,1},1}.知道怎么把它投到Array{Float64,2}吗?

hal*_*tan 6

如果看一下的定义cat(这是潜在的功能hcat和vcat),你看到可以收集多个阵列成尺寸2的一个单一的阵列:

cat(2, [1,2], [3,4], [5,6])

2×3 Array{Int64,2}:
 1  3  5
 2  4  6
Run Code Online (Sandbox Code Playgroud)

这基本上就是你想要的.问题是你有一个数组本身的所有输出极点.cat希望你提供它们作为几个参数.这是...进来的地方.

... 用于在函数调用的上下文中使用时,将单个函数参数拆分为许多不同的参数.

因此,你可以写

cat(2, [[1,2], [3,4], [5,6]]...)

2×3 Array{Int64,2}:
 1  3  5
 2  4  6
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它的工作方式完全相同(我改变了你的x列数):

x=rand(2,5)
cat(2, cart2pol.(view(x,1,:),view(x,2,:))...)

2×5 Array{Float64,2}:
 0.587301  0.622    0.928159  0.579749  0.227605
 1.30672   1.52956  0.352177  0.710973  0.909746
Run Code Online (Sandbox Code Playgroud)

  • 我们应该有一个功能来做到这一点,而不是splatting; 因此,我打开了一个问题:https://github.com/JuliaLang/julia/issues/21672. (2认同)