면책 조항 : 다음 방법은 최적의 것으로 엄격히 입증되지 않았습니다. 비공식 증거가 제공됩니다.
문제는 제품의 제곱을 고려할 때 가장 효율적인 순서를 찾는 것으로 줄어 듭니다.
예를 볼 때 예를 들어, , 우리는 최적 풀어야 ( B C ) (2) 이 팽창 이후 B C B C . A B C를 다시 연결하면 유용한 주문 정보가 추가되지 않습니다 . 여기서 직관은 최적 순서의 문제를 상향식으로 해결할 수 있기 때문에 동일한 행렬을 사용하는 더 많은 요소로 구성된 높은 순서는 관련이 없다는 것입니다.(ABC)50(ABC)2ABCABCABC
ABCABC
A(B(CA))BCA(B(CA))49BC
(A1A2⋯An)m(A1A2⋯An)2
(A1A2⋯An)2
GA1⋅A2⋅Gm−1⋅An
(AB)nABX×YY×XAB
X×Y
Y×X
Y×Y
X×X
X<YY≤X
X<Y
ABX×XAB(AB)n
Y≤X
BAY×YABA(BA)n−1B
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)