Matrix 在Julia中将矩阵提升为幂
我正在用Julia编写代码,它涉及将一个大的整数矩阵提升到一个高次方,我想让这个代码更高效。我一直在JuliaLang上搜索,但我不确定当我在Julia中将矩阵提升到幂时,Julia是否会自动使用可用的最快方法(二进制求幂或类似方法),或者它是否会按顺序乘以矩阵,例如a^p=a*a*…*我可以通过手动实现二进制求幂来加速我的代码吗,或者Julia已经在为我这么做了 Julia提供了解决这个问题所需的所有内省方法。由于基本库是开源的,几乎完全是用Julia编写的,所以很容易看到。请看一下:Matrix 在Julia中将矩阵提升为幂,matrix,julia,linear-algebra,matrix-multiplication,Matrix,Julia,Linear Algebra,Matrix Multiplication,我正在用Julia编写代码,它涉及将一个大的整数矩阵提升到一个高次方,我想让这个代码更高效。我一直在JuliaLang上搜索,但我不确定当我在Julia中将矩阵提升到幂时,Julia是否会自动使用可用的最快方法(二进制求幂或类似方法),或者它是否会按顺序乘以矩阵,例如a^p=a*a*…*我可以通过手动实现二进制求幂来加速我的代码吗,或者Julia已经在为我这么做了 Julia提供了解决这个问题所需的所有内省方法。由于基本库是开源的,几乎完全是用Julia编写的,所以很容易看到。请看一下: jul
julia> A = rand(1:10, 4, 4); p = 3;
julia> @less A^p
function (^)(A::AbstractMatrix{T}, p::Integer) where T<:Integer
# make sure that e.g. [1 1;1 0]^big(3)
# gets promotes in a similar way as 2^big(3)
TT = promote_op(^, T, typeof(p))
return power_by_squaring(convert(AbstractMatrix{TT}, A), p)
end
二进制指数运算!现在,这不会重复使用任何临时变量,因此您可以明智地使用in-place
mul做得更好
值得指出的一点是,如果矩阵是平方的,则幂非常大(>50),通过变换到约当范式
、升高和变换回来,可能会节省时间。此链接提供了数学方面的基础知识最相关的问题是和。这有用吗?
julia> @less Base.power_by_squaring(A, p)
"(e.g., [2.0 1.0;1.0 0.0]^$p instead ",
"of [2 1;1 0]^$p), or write float(x)^$p or Rational.(x)^$p")))
function power_by_squaring(x_, p::Integer)
x = to_power_type(x_)
# … skipping the obvious branches to find …
t = trailing_zeros(p) + 1
p >>= t
while (t -= 1) > 0
x *= x
end
y = x
while p > 0
t = trailing_zeros(p) + 1
p >>= t
while (t -= 1) >= 0
x *= x
end
y *= x
end
return y
end