如何在linspace上使用理解来创建矩阵

时间:2017-10-13 23:37:56

标签: julia

我想生成一个n x 3矩阵,其中n是像素数(宽度*高度)。

x = linspace(-1, 1, width)
y = linspace(-1, 1, height)

r = 1.0

viewDirections = [[i j 1.0] for i in x for j in y]

然而,当我运行这个时,我得到了一个:

16-element Array{Array{Float64,2},1}

而不是我想要的16x3 Array{Float64,2}。我显然没有正确地使用理解来构造矩阵。我尝试使用comprehensions来创建一个元组数组,但我无法将这些元组转换为矩阵。

1 个答案:

答案 0 :(得分:2)

这里的问题是array comprehension会给我们一个嵌套数组而不是Matrix。这是正确的理解行为,它不会为我们做额外的猜测,所以我们需要手动将嵌套数组转换为矩阵,这可以使用带有splating运算符的vcat来完成({{1} }):

...

您似乎正在从2D欧几里德空间构建homogeneous coordinates。使用julia> vcat(viewDirections...) 6×3 Array{Float64,2}: -1.0 -1.0 1.0 -1.0 1.0 1.0 0.0 -1.0 1.0 0.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 是一种更简洁,更健壮的方法来创建迭代器:

Base.Iterators.product

请注意,坐标的顺序与原始版本不同,因为Julia是列专业,julia> w = linspace(-1,1,3) -1.0:1.0:1.0 julia> h = linspace(-1,1,2) -1.0:2.0:1.0 julia> r = 1.0 1.0 julia> viewDirections = [collect(i) for i in Iterators.product(w, h, r)] 3×2 Array{Array{Float64,1},2}: [-1.0, -1.0, 1.0] [-1.0, 1.0, 1.0] [0.0, -1.0, 1.0] [0.0, 1.0, 1.0] [1.0, -1.0, 1.0] [1.0, 1.0, 1.0] julia> hcat(viewDirections...).' 6×3 Array{Float64,2}: -1.0 -1.0 1.0 0.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 将迭代最严格的维度" outestly"即Iterators.product。如果订单在您的用例中很重要,请注意它。 以下是[[i j r] for j in y for i in x ]变大时的一些基准测试结果:

width/height