使用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
.它适用于一维,但不适用于多维。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 x 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()
在一个循环中变得复杂。
最佳答案
也会:
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
是一个相关的解决方案?
关于arrays - 在 Julia 的循环中使用 vcat() 或 hcat() 构造矩阵的更好算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580420/