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)