矩阵链乘法和求幂


13

如果我有两个矩阵AB,分别为维度1000×22×1000,并且要计算(AB)5000,则将表达式重写为A(BA)^ {4999}效率更高BA(BA)4999B,然后才进行数字评估,因为AB的尺寸为1000×1000BA的尺寸为2×2

我想解决此问题的广义版本。是否有合理有效的算法(不是蛮力)来优化包含以下内容的表达式:

  • 已知尺寸的自由矩阵变量
  • 任意子表达式的乘积
  • 任意子表达式提升为自然幂

...这样,用自由矩阵变量替换为具体的矩阵值之后,进行数字评估所需的工作最少。

矩阵链乘积问题是我的问题的一个特例。


编辑:

这是一个暂定答案。直觉上对我来说似乎正确,但是我没有证据证明它是正确的。如果事实证明是正确的,我仍然对证明感兴趣。(当然,如果不正确,请纠正我。)

对于每个幂的乘积,例如(A_1 A_2 \ ldots A_k)^ n(A1A2Ak)n,请考虑因子的每个循环排列:

  • (A1A2Ak)n
  • A1(A2AkA1)n1A2Ak
  • A1A2(A3AkA1A2)n1A3Ak
  • ...
  • A1A2Ak1(AkA1A2Ak1)n1Ak

...递归地 每个幂将使用平方平方的幂计算(显然),而所有其他乘积将使用矩阵链乘法算法返回的最佳顺序进行计算。


编辑:

我之前的编辑中概述的想法仍然有些不理想。平方算法的求幂实际上是评估或形式的表达式,其中不一定是恒等矩阵。但是我的算法没有考虑使用平方不等于的平方算法求幂的可能性。KAnAnKKK


@ gnasher729:对不起,我应该更明确一些。我不想暴力破解所有可能性,出于完全相同的原因,您也不想通过暴力破解矩阵链乘法。我只是相应地编辑了问题。
pyon

请注意,即使在巧妙地将表达式其为仍然更加聪明。关键是,您可能必须在矩阵链乘法和其他标准算法之间混合以实现快速求幂。A(BA)4999B
A(BA)2(21249+1)+1B
Apiwat Chantawibul

@Billiska:的确,这正是我想要做的:通过对单个矩阵进行平方运算,将矩阵链乘法和乘幂运算相结合。但是有一些讨厌的问题。给定,如何防止算法进一步尝试,等等?A(BA)n1BAB(AB)n2ABABA(BA)n3BAB
pyon

我们将基础更改为特征向量以进行矩阵求幂,并且当所有矩阵都具有幂1时,我们可以使用矩阵链乘法。
Deep Joshi

@DeepJoshi抱歉,我觉得您的评论很简洁。但是,如果我正确理解了您的想法,恐怕它在一般情况下将不起作用,因为矩阵的本征空间维数之和不必等于。换句话说,并不是每个向量都可以表示为特征向量的线性组合的情况。n×nn
pyon

Answers:


3

免责声明:未严格证明以下方法是最佳方法。提供了非正式证明。

当考虑产品的平方时,问题减少到寻找最有效的订购。

例如,当查看例如,我们只需要最优解因为它扩展为。再次串联不会添加任何有用的订购信息。这里的直觉是,由于可以自下而上地解决最佳排序的问题,因此使用相同矩阵由更多元素组成的更高排序是不相关的。(ABC)50(ABC)2ABCABCABC

找到的最佳顺序为矩阵链乘法问题。找到最佳排序后,将求幂应用于排序中的三元组(通常为n元组)。ABCABC

例如,如果平方的最佳排序是,则初始问题的解是。A(B(CA))BCA(B(CA))49BC

概括而言:
1)求解第一步是求解。 2)最好将作为矩阵链乘法问题的一个实例。 3)使用(2)中的解决方案的n元组排序将为我们提供(1)的解决方案,即某种风味(请注意,其他任何(2)中的分组也应适用。(A1A2An)m(A1A2An)2
(A1A2An)2
GA1A2Gm1An

非正式的证据
使用两个矩阵考虑最简单的情况下,,我们是注意到和的维度和分别。任何使用和都具有以下尺寸之一:(AB)nABX×YY×XAB

X×Y
Y×X
Y×Y
X×X

我们有或。X<YYX

假设1a): 具有维数,并且从下而上的方法可以保证这种排序是最佳的。和其他任何配置都相同或更好。因此,该问题被最佳地解决为。X<Y
ABX×XAB(AB)n

假设1b): 尺寸为。这是涉及和所有产品的最佳订购。因此,该溶液被最佳发现为。YX
BAY×YABA(BA)n1B

这样就证明了这一结论,我们只研究了平方问题中的两个排序。ABAB

使用更多矩阵,论点是相似的。也许可以归纳证明?一般的想法是,求解平方的MCM将为考虑所有涉及矩阵的操作找到最佳大小。

案例分析:

julia> a=rand(1000,2);
julia> b=rand(2,1000);
julia> c=rand(1000,100);
julia> d=rand(100,1000);
julia> e=rand(1000,1000);

julia> @time (a*b*c*d*e)^30;
  0.395549 seconds (26 allocations: 77.058 MB, 1.58% gc time)

# Here I use an MCM solver to find out the optimal ordering for the square problem
julia> Using MatrixChainMultiply
julia> matrixchainmultiply("SOLVE_SQUARED", a,b,c,d,e,a,b,c,d,e)
Operation: SOLVE_SQUARED(A...) = begin  # none, line 1:
    A[1] * (((((A[2] * A[3]) * (A[4] * (A[5] * A[6]))) * (A[7] * A[8])) * A[9]) * A[10])
  end
Cost: 6800800

# Use the ordering found, note that exponentiation is applied to the group of 5 elements
julia> @time a*(((((b*c)*(d*(e*a)))^29*(b*c))*d)*e);
  0.009990 seconds (21 allocations: 7.684 MB)

# I also tried using the MCM for solving the problem directly
julia> @time matrixchainmultiply([30 instances of a,b,c,d,e]);
  0.094490 seconds (4.02 k allocations: 9.073 MB)

1
您能证明足以考虑的说法吗?在我看来,这似乎并不明显。(ABC)2
David Richerby '17

@DavidRicherby我对此没有任何证据,但由于问题本质上是循环的,因此似乎很直观,并且每个唯一的循环排序都发生在并且没有其他术语可以提供任何新的循环组。我的假设是被最佳为下列中的一个来计算:,或。如果有时间,我明天会尝试证明。ABCABC(ABC)n(ABC)nA(BCA)n1BCAB(CAB)n1C
matteyas

@DavidRicherby是添加的非正式使用证明吗?
matteyas

@matteyas:这差不多是我在对问题的第一次编辑中说的,对吗?
pyon

@matteyas好的,所以我想重点是,因为我们有一个重复的序列,所以中间矩阵的大小只有固定数目,而在您查看时,您已经看到了所有这些。ABCABC
David Richerby

-1

如果你想计算n的产品矩阵到在最好的时候,你可以很容易地计算出需要多少运算计算的产品到对所有1≤I≤Ĵ≤n的步骤。A1AnAiAjO(n3)


3
这没有考虑提升到幂的子表达式(如果幂很大,可能效率很低),也没有考虑使用快速幂运算来实现更好的加速的机会,所以我怀疑还不是最佳答案。
DW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.