首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >julia 4192*4192矩阵不能平方,循环超过7分钟

julia 4192*4192矩阵不能平方,循环超过7分钟
EN

Stack Overflow用户
提问于 2021-08-26 01:34:55
回答 2查看 67关注 0票数 1

我有这个矩阵,它的大小是4192*4192,现在我想要这个矩阵squared.But,无论我在jupyter notebook中还是在julia pro中平方,它都没有结束(超过5分钟)。

有没有可能无法解析如此大小的矩阵乘法?在python中,这将立即完成。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-26 08:55:41

您的矩阵具有Array{Any, 2}类型,这意味着Julia不知道您的矩阵单元格中可能包含什么内容。您很可能已经用Any类型初始化了一个空数组,然后一个接一个地填充它。

Any的性能影响

为了向您展示您错过了什么,这里是使用Any类型创建数组与使用Floats创建数组的比较。

代码语言:javascript
复制
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秒。现在,如果你的数组有一个浮点类型,你可以得到:

代码语言:javascript
复制
fast_matrix = rand(400, 400)

@benchmark fast_matrix * fast_matrix

由于fast_matrix的类型为Matrix{Float64},Julia将确切地知道每个μ包含的内容,因此它的运行速度为800cell s(加速4000x)。

如何避免这种情况

如果您需要一个与另一个数组类似的带有0的空数组,则可以使用zero

代码语言:javascript
复制
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

这将保持原始对象的类型。

如果你想要一个特定大小的全新数组,像这样初始化它:

代码语言:javascript
复制
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矩阵的基准测试:

代码语言:javascript
复制
big_boy = rand(4192, 4192)

@benchmark big_boy * big_boy

中位时间为726.261ms。

票数 4
EN

Stack Overflow用户

发布于 2021-08-26 12:34:49

问题的发生是因为我的矩阵中的数据类型是any,在转换矩阵中的数据类型后,问题就解决了!

代码语言:javascript
复制
a : Array{any,2}
a = convert(Array{Float64,2}, a) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68931490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档