julia 4192*4192 矩阵无法平方,一直循环超过 7 分钟
julia 4192*4192 matrix can't be squared,keeps looping more than 7minutes
我有这个大小为 4192*4192 的矩阵,现在我想要这个矩阵 squared.But 无论我在 jupyter notebook 中还是在 julia pro 中对它求平方,它都没有尽头(超过 5 分钟)。
难不成这样大的矩阵乘法无法解析? python 一分钟内完成。
您的矩阵的类型为 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 秒。
现在,如果你的数组有一个 Float 类型,你可以得到这个:
fast_matrix = rand(400, 400)
@benchmark fast_matrix * fast_matrix
这会在 800 微秒内运行(加速 4000 倍)因为 fast_matrix
的类型是 Matrix{Float64}
并且 Julia 会确切地知道每个单元格包含什么。
如何避免这种情况
如果您需要一个类似于另一个数组的带有 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.261 毫秒。
问题是因为我的矩阵数据类型是any,转换我矩阵数据类型后问题解决!
a : Array{any,2}
a = convert(Array{Float64,2}, a)
我有这个大小为 4192*4192 的矩阵,现在我想要这个矩阵 squared.But 无论我在 jupyter notebook 中还是在 julia pro 中对它求平方,它都没有尽头(超过 5 分钟)。
难不成这样大的矩阵乘法无法解析? python 一分钟内完成。
您的矩阵的类型为 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 秒。 现在,如果你的数组有一个 Float 类型,你可以得到这个:
fast_matrix = rand(400, 400)
@benchmark fast_matrix * fast_matrix
这会在 800 微秒内运行(加速 4000 倍)因为 fast_matrix
的类型是 Matrix{Float64}
并且 Julia 会确切地知道每个单元格包含什么。
如何避免这种情况
如果您需要一个类似于另一个数组的带有 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.261 毫秒。
问题是因为我的矩阵数据类型是any,转换我矩阵数据类型后问题解决!
a : Array{any,2}
a = convert(Array{Float64,2}, a)