gpt4 book ai didi

julia - 如何使用对 linspace 的推导来创建矩阵

转载 作者:行者123 更新时间:2023-12-04 21:05:38 26 4
gpt4 key购买 nike

我想生成一个 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} .我显然没有正确使用理解来构建矩阵。我尝试使用推导来创建一个元组数组,但我无法将这些元组转换为矩阵。

最佳答案

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

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

看起来您正在构建 homogeneous coordinates来自二维欧几里得空间。使用 Base.Iterators.product是一种更简洁、更健壮的方法来创建迭代器:
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

请注意,坐标顺序与您的原始版本不同,这是因为 Julia 是列优先的, Iterators.product将“最直接地”迭代最右边的维度,即 [[i j r] for j in y for i in x ] .如果订单在您的用例中很重要,请注意它。
以下是 width/height 时的一些基准测试结果变大:
julia> w = linspace(-1,1,300)
-1.0:0.006688963210702341:1.0

julia> h = linspace(-1,1,200)
-1.0:0.010050251256281407:1.0

julia> foo(w,h,r) = hcat([collect(i) for i in Iterators.product(w, h, r)]...).'

julia> bar(w,h,r) = vcat([[i j r] for i in w for j in h]...)

julia> @btime foo($w,$h,$r);
6.172 ms (60018 allocations: 10.99 MiB)

julia> @btime bar($w,$h,$r);
11.294 ms (360028 allocations: 17.02 MiB)

关于julia - 如何使用对 linspace 的推导来创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com