我有这个矩阵,它的大小是4192*4192,现在我想要这个矩阵squared.But,无论我在jupyter notebook中还是在julia pro中平方,它都没有结束(超过5分钟)。
有没有可能无法解析如此大小的矩阵乘法?在python中,这将立即完成。

发布于 2021-08-26 08:55:41
您的矩阵具有Array{Any, 2}类型,这意味着Julia不知道您的矩阵单元格中可能包含什么内容。您很可能已经用Any类型初始化了一个空数组,然后一个接一个地填充它。
Any的性能影响
为了向您展示您错过了什么,这里是使用Any类型创建数组与使用Floats创建数组的比较。
using BenchmarkTools
slow_matrix = Array{Any, 2}(undef, 400, 400)
for i in 1:400
for j in 1:400
slow_matrix[i, j] = rand()
end
end
@benchmark slow_matrix * slow_matrix在我的机器上,它的平均运行时间是3.879秒。现在,如果你的数组有一个浮点类型,你可以得到:
fast_matrix = rand(400, 400)
@benchmark fast_matrix * fast_matrix由于fast_matrix的类型为Matrix{Float64},Julia将确切地知道每个μ包含的内容,因此它的运行速度为800cell s(加速4000x)。
如何避免这种情况
如果您需要一个与另一个数组类似的带有0的空数组,则可以使用zero
julia> A = rand(4, 4)
4×4 Matrix{Float64}:
0.447232 0.951705 0.214183 0.97295
0.0605242 0.348032 0.882958 0.00489095
0.320847 0.993347 0.0280731 0.341089
0.14846 0.448864 0.626297 0.269931
julia> zero(A)
4×4 Matrix{Float64}:
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 = Array{Float64, 2}(undef, 2, 2)
2×2 Matrix{Float64}:
2.32289e-314 2.28075e-314
2.2895e-314 2.28075e-314您可以通过这种方式设置任意大小或尺寸,但必须设置单元格类型,在本例中为Float64。
朱莉娅并不慢
为了证明您确实可以将这些矩阵相乘,以下是4192x4192矩阵的基准测试:
big_boy = rand(4192, 4192)
@benchmark big_boy * big_boy中位时间为726.261ms。
发布于 2021-08-26 12:34:49
问题的发生是因为我的矩阵中的数据类型是any,在转换矩阵中的数据类型后,问题就解决了!
a : Array{any,2}
a = convert(Array{Float64,2}, a) https://stackoverflow.com/questions/68931490
复制相似问题