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)