Julia 如何初始化具有正确维数的矩阵矩阵?

Julia 如何初始化具有正确维数的矩阵矩阵?,julia,Julia,我想创建一个nxm维矩阵,该矩阵是kxk维矩阵(包含零) 我怎么能在朱莉娅身上做到这一点 n-d理解可能是最简单的: [zeros(k,k) for i=1:n, j=1:m] 更新:此处您需要小心:可能您希望用不同的零矩阵填充数组:其他建议的解决方案(fill或repmat)将实际为您提供一个数组,其中所有条目都是相同的零矩阵,例如: julia> k = 2; n = 3; m = 4; A = fill(zeros(k, k), n, m) 3×4 Array{Array{Floa

我想创建一个
nxm
维矩阵,该矩阵是
kxk
维矩阵(包含零)


我怎么能在朱莉娅身上做到这一点

n-d理解可能是最简单的:

[zeros(k,k) for i=1:n, j=1:m]
更新:此处您需要小心:可能您希望用不同的零矩阵填充数组:其他建议的解决方案(
fill
repmat
)将实际为您提供一个数组,其中所有条目都是相同的零矩阵,例如:

julia> k = 2; n = 3; m = 4; A = fill(zeros(k, k), n, m)
3×4 Array{Array{Float64,2},2}:
 [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]
 [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]
 [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]  [0.0 0.0; 0.0 0.0]

julia> A[1,1][1,1] = 1; A
3×4 Array{Array{Float64,2},2}:
 [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]
 [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]
 [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]  [1.0 0.0; 0.0 0.0]

我也用类似的东西


填充(零(k,k),n,m)

另一个答案,补充上面已经很漂亮的答案

repmat([zeros(k,k)], n,m)
(或者它在语法上更灵活的表亲
repeat([zero(k,k)],outer=(n,m))

编辑:这似乎是迄今为止最快的方法
我将把基准放在下面:
基准: (从最快到最慢)


您想要的输出没有出现。出于好奇,我做了一些基准测试(见下文)。相比之下,朱莉娅的列表理解有点慢/我想知道为什么速度会慢得多。我不知道为什么列表理解会比其他方法慢得多(Good work@tasospapstyllanou!)。这取决于你计时的方式:试着把它放在一个函数中:
foo(k,m,n)=[zero(k,k)for I=1:n,j=1:m]
谢谢你的更新。我不得不说,虽然它的文档中有一个关于
fill
的明确警告,但我会将其归类为
repmat
的一个bug,因为单个评估不太可能是用户想要的;(除非明确规定,否则至少不能)。这类函数似乎是为了方便人们从matlab迁移而包含的,而没有过多地考虑它可能如何在julia中出现。谢谢你的接球;我将删除我的答案并提交一份错误报告。
repmat
的另一个优点是它会立即被octave/matlab用户识别和喜爱:pi怀疑你在全球范围内做了基准测试,我机器上的基准测试显示
fill
是最快的,
repmat
comprehension
完全相同(大约比
fill
慢6倍)。是的,没错!知道这件事很有趣;全局作用域和局部作用域是如何影响这种情况的?这里有一些参考资料:&。这可能没有达到您的预期:尝试设置
A[1,1][1,1]=1
,然后查看
A
(同样,它只适用于0.5或更高版本)。这并没有达到您预期的效果:尝试
A[1,1][1,1]=1
,然后查看
A
,啊,好的捕获。我没有意识到它会通过
m
指针将
n
粘贴到矩阵中的同一个矩阵。
k = 2; n = 3; m = 4

julia> @time for i in 1:10e4; A = repmat([zeros(k,k)], n,m); end
  0.601392 seconds (2.80 M allocations: 112.915 MB, 1.49% gc time)

julia> @time for i in 1:10e4; A = fill(zeros(k,k), n,m); end
  1.053698 seconds (200.00 k allocations: 27.466 MB, 0.13% gc time)

julia> @time for i in 1:10e4; A = repeat([zeros(k,k)], outer=(n,m)); end
  1.217569 seconds (6.10 M allocations: 222.778 MB, 1.97% gc time)

julia> @time for i in 1:10e4; A = [zeros(k,k) for i=1:n, j=1:m]; end
  8.217551 seconds (2.83 M allocations: 214.951 MB, 0.19% gc time)