使用vcat()或hcat()在Julia的循环中构造矩阵的更好算法?

时间:2017-01-10 23:41:03

标签: arrays algorithm matrix julia

要使用vcat(a,b)hcat(a,b),必须匹配矩阵ab中的列数或行数。

在循环中使用vact(a, b)hcat(a, b)构造矩阵时,需要一个初始矩阵a(就像一个起始语句)。尽管所有子矩阵都以相同的方式创建,但我可能需要在循环之外构造此初始矩阵a

例如,如果循环条件为for i in 1:w,那么我需要使用a预创建i = 1,然后使用for i in 2:w启动循环。

如果有嵌套循环,那么我的方法非常尴尬。我已经考虑过以下方法,但似乎它们并没有真正起作用:

  1. 使用虚拟a,在循环后删除a。从这个question,我们不能删除矩阵中的行。如果我们使用另一个变量来引用有用的行和列,我们可能会浪费一些内存分配。

  2. 使用reshape()制作空假人a。它适用于1维,但不适用于多维。

    julia> a = reshape([], 2, 0)
    2×0 Array{Any,2}
    
    julia> b = hcat(a, [3, 3])
    2×1 Array{Any,2}:
     3
     3
    
    julia> a = reshape([], 2, 2)
    ERROR: DimensionMismatch("new dimensions (2,2) must be consistent with array size 0")
     in reshape(::Array{Any,1}, ::Tuple{Int64,Int64}) at ./array.jl:113
     in reshape(::Array{Any,1}, ::Int64, ::Int64, ::Vararg{Int64,N}) at ./reshapedarray.jl:39
    
  3. 所以我的问题是如何在循环中使用vcat()hcat()

    修改: 这是我陷入困境的问题:

    有许多灰色像素图像。每个都表示为20乘20 Float64数组。一个函数foo(n)随机选择这些矩阵的n,并将它们组合成一个大正方形。

    如果n具有整数平方根,则foo(n)会返回sqrt(n) * 20sqrt(n) * 20矩阵。

    如果n没有整数平方根,则foo(n)会返回ceil(sqrt(n)) * 20ceil(sqrt(n)) * 20矩阵。在大方块图像的最后一行(一行20 x 20矩阵)中,foo(n)填充ceil(sqrt(n)) ^ 2 - n个额外的黑色图像(每个图像都表示为zeros(20,20))。

    我目前的foo(n)算法是使用嵌套循环。在内循环中,hcat()构建一个图层(包含ceil(sqrt(n))图像)。在外部循环中,vcat()组合了这些层。

    然后在循环中处理hcat()vcat()变得复杂。

1 个答案:

答案 0 :(得分:3)

所以会:

pickimage() = randn(20,20)
n = 16
m = ceil(Int, sqrt(n))
out = Matrix{Float64}(20m, 20m)
k = 0
for i in (1:m)-1
   for j in (1:m)-1
       out[20i + (1:20), 20j + (1:20)] .= ((k += 1) <= n) ? pickimage() : zeros(20,20)
   end
end

是一个相关的解决方案吗?