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

标签 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 .它适用于一维,但不适用于多维。

    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/

相关文章:

c++ - 数组的引用

python - 在 python 中解压数组

c++ - 汉明立方体的数据结构

css - css3 matrix3d 第四列背后的精确数学是什么?

c - 返回列表数组上的指针?

javascript - 使用 for 循环填充数组并显示它

java - 在java中实现Pi算法

algorithm - 有约束的座位算法

opengl - GLSL从modelviewmatrix和viewmatrix中提取modelmatrix

math - 将屏幕上的点反投影回等距投影的世界