首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组作为列附加到预先初始化的矩阵中

将数组作为列附加到预先初始化的矩阵中
EN

Stack Overflow用户
提问于 2019-05-04 12:43:30
回答 1查看 87关注 0票数 1

我希望使用索引来填充预先初始化的矩阵,其中包含用于循环输出的数组的结果:

代码语言:javascript
复制
  A = Float64.(reshape(1.0:81.0,9,9))
  # initialize output
  B = zeros(Int64, 2, 9)
  j = 1
  for j in 1:size(A,2) # loop cols
    out = [sum(A[:,j]),j]
    out = reshape(out,2,1) # make column to append
    # append out to the B
    global B = hcat(B,out) # this grows...
  end

我初始化了B = zeros(Int64, 2, 9)

sum操作的预期输出相同。

在我的真实世界中-我正在迭代j,列,以及,我的行-输出是一个数组.与其使用hcat()将数组附加到输出中,我还能用索引来完成吗?

在上面的代码中,它使用hcat(),然后将其附加到现有的B中,这样它就会增长。此后,我尝试了使用行2和cols 0来初始化,因此hcat()构建来纠正输出dim:

代码语言:javascript
复制
B = zeros(Int64, 2, 0)

我怀疑hcat()是否具有内存效率(例如,使用全局索引的借口)--如果我不能用索引进行索引,我可以在i,j处为另一个内循环填充它。但也许有人可以将数组作为列附加到现有的预初始化输出中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-04 14:17:21

建议是预先分配B,然后再填充它。我将代码包装在一个函数中,因为它简化了基准测试:

代码语言:javascript
复制
function f2()
    A = reshape(1:81,9,9)
    B = zeros(Int64, 2, 9 + size(A,2))
    for j in 1:size(A,2) # loop cols
        B[:, j + 9] .= (sum(view(A, :, j)), j)
    end
    B
end

你的旧代码是:

代码语言:javascript
复制
function f1()
    A = Float64.(reshape(1.0:81.0,9,9))
    B = zeros(Int64, 2, 9)
    j = 1
    for j in 1:size(A,2) # loop cols
        out = [sum(A[:,j]),j]
        out = reshape(out,2,1) # make column to append
        # append out to the B
        B = hcat(B,out)
    end
    B
end

下面是一个比较:

代码语言:javascript
复制
julia> @btime f1()
  8.567 μs (83 allocations: 7.72 KiB)
2×18 Array{Float64,2}:
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  45.0  126.0  207.0  288.0  369.0  450.0  531.0  612.0  693.0
 0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   1.0    2.0    3.0    4.0    5.0    6.0    7.0    8.0    9.0

julia> @btime f2()
  73.662 ns (1 allocation: 368 bytes)
2×18 Array{Int64,2}:
 0  0  0  0  0  0  0  0  0  45  126  207  288  369  450  531  612  693
 0  0  0  0  0  0  0  0  0   1    2    3    4    5    6    7    8    9

你可以看到,这两者之间的差别是非常显著的。

对原始代码的一些更小的注释:

  • 不需要在Float64.上调用reshape(1.0:81.0,9,9),对象已经保存了具有Float64值的元素。
  • 在您的代码中,有一个不一致之处,最初是B持有Int64A持有Float64 --我已经使其保持一致(我选择了Int64,但同样好,您可以使用Float64)。
  • sum(A[:,j])不必要地分配了一个新对象;使用view更快
  • 在将向量作为向量处理为柱状对象之前,不必在reshape(out,2,1)上调用out
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55982635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档