我想生成一个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来创建一个元组数组,但我无法将这些元组转换为矩阵。
答案 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