要使用vcat(a,b)
和hcat(a,b)
,必须匹配矩阵a
和b
中的列数或行数。
在循环中使用vact(a, b)
或hcat(a, b)
构造矩阵时,需要一个初始矩阵a
(就像一个起始语句)。尽管所有子矩阵都以相同的方式创建,但我可能需要在循环之外构造此初始矩阵a
。
例如,如果循环条件为for i in 1:w
,那么我需要使用a
预创建i = 1
,然后使用for i in 2:w
启动循环。
如果有嵌套循环,那么我的方法非常尴尬。我已经考虑过以下方法,但似乎它们并没有真正起作用:
使用虚拟a
,在循环后删除a
。从这个question,我们不能删除矩阵中的行。如果我们使用另一个变量来引用有用的行和列,我们可能会浪费一些内存分配。
使用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
所以我的问题是如何在循环中使用vcat()
和hcat()
?
修改: 这是我陷入困境的问题:
有许多灰色像素图像。每个都表示为20乘20 Float64
数组。一个函数foo(n)
随机选择这些矩阵的n
,并将它们组合成一个大正方形。
如果n
具有整数平方根,则foo(n)
会返回sqrt(n) * 20
个sqrt(n) * 20
矩阵。
如果n
没有整数平方根,则foo(n)
会返回ceil(sqrt(n)) * 20
个ceil(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()
变得复杂。
答案 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
是一个相关的解决方案吗?