행렬 사슬 곱셈과 지수


13

크기가 각각 및 인 두 개의 행렬 와 있고 을 계산 하려면 먼저 식을 로 다시 작성하는 것이 더 효율적입니다 의 크기는 이지만 의 크기는 2 × 2 이므로 만 계산 한 다음 숫자로만 평가 합니다 .AB1000×22×1000(AB)5000A(BA)4999BAB1000×1000BA2×2

이 문제의 일반화 된 버전을 해결하고 싶습니다. 다음을 포함하는 표현식을 최적화하는 합리적으로 효율적인 알고리즘 (무차별적인 힘이 아님)이 있습니까?

  • 알려진 차원의 자유 행렬 변수
  • 임의 하위 식의 곱
  • 자연의 힘으로 올라간 임의의 하위 표현

... 자유 행렬 변수를 콘크리트 행렬 값으로 대체 한 후 수치 적으로 평가하는 데 가장 적은 양의 작업이 필요합니까?

매트릭스 체인 곱셈 문제는 내 문제의 특별한 경우이다.


편집하다:

이것은 잠정적 인 답변입니다. 직관적으로 옳아 보이지만 그것이 옳다는 증거는 없습니다. 그것이 올바른 것으로 판명되면, 나는 여전히 증거에 관심이 있습니다. (정확하지 않은 경우에는 반드시 수정하십시오.)

과 같이 거듭 제곱 한 모든 곱 에 대해 요인의 모든 주기적 순열을 고려하십시오.(A1A2Ak)n

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

... 재귀 적으로. 각 거듭 제곱은 (분명히) 제곱에 의한 지수를 사용하여 계산되며, 다른 모든 제품은 행렬 체인 곱셈 알고리즘에 의해 반환 된 최적 순서를 사용하여 계산됩니다.


편집하다:

이전 편집에서 설명한 아이디어는 여전히 최적이 아닙니다. 제곱 알고리즘에 의한 지수는 실제로 또는 A n K 형식의 표현식을 평가합니다 . 여기서 K 는 반드시 항등 행렬이 아닙니다. 그러나 내 알고리즘은 ID 행렬과 같지 않은 K로 알고리즘을 제곱하여 지수를 사용할 가능성을 고려하지 않습니다 .KAnAnKKK


@ gnasher729 : 죄송합니다, 더 분명해야했습니다. 나는 모든 가능성을 무차별 대입하고 싶지 않습니다. 왜냐하면 당신은 무차별 대입으로 행렬 체인 곱셈을 풀고 싶지 않은 것과 같은 이유로 말입니다. 그에 따라 질문을 편집했습니다.
pyon 2012 년

심지어 당신이 영리 요인 발현 후 주 ( B ) 4999 B 아직도 요인에 더 똑똑 그것으로 ( B ) 2 * ( 2 * 1249 + 1 ) + 1 B . 요점은 빠른 지수화를 위해 행렬 체인 곱셈과 다른 표준 알고리즘을 혼합해야 할 것입니다. A(BA)4999B
A(BA)2(21249+1)+1B
Apiwat Chantawibul

@Billiska : 사실, 정확히 내가하고 싶은 일은 결합 된 문제에 대한 단일 알고리즘으로 제곱하여 행렬 체인 곱셈과 지수를 결합합니다. 그러나 성가신 문제가 있습니다. 주어진 , 알고리즘이 A B ( A B ) n - 2 A B , A B A ( B A ) n - 3 B A B 등 을 더 시도하지 못하게하려면 어떻게해야 합니까? A(BA)n1BAB(AB)n2ABABA(BA)n3BAB
연못

행렬 지수화를 위해 기본을 고유 벡터로 변경하고 모든 행렬에 1의 거듭 제곱이 있으면 행렬 체인 곱셈을 사용할 수 있습니다.
Deep Joshi

@DeepJoshi 죄송합니다. 귀하의 의견이 다소 간결합니다. 내가 제대로 당신의 생각을 이해하는 경우의 고유 공간의 크기 때문에 그러나, 나는 그것이 일반적인 경우에 작동하지 않습니다 두려워 행렬 필요를 추가하지 N . 다시 말해, 모든 벡터가 항상 고유 벡터의 선형 조합으로 표현 될 수있는 것은 아닙니다. n×nn
pyon April

답변:


3

면책 조항 : 다음 방법은 최적의 것으로 엄격히 입증되지 않았습니다. 비공식 증거가 제공됩니다.

문제는 제품의 제곱을 고려할 때 가장 효율적인 순서를 찾는 것으로 줄어 듭니다.

예를 볼 때 예를 들어, , 우리는 최적 풀어야 ( B C ) (2) 이 팽창 이후 B C B C . A B C를 다시 연결하면 유용한 주문 정보가 추가되지 않습니다 . 여기서 직관은 최적 순서의 문제를 상향식으로 해결할 수 있기 때문에 동일한 행렬을 사용하는 더 많은 요소로 구성된 높은 순서는 관련이 없다는 것입니다.(ABC)50(ABC)2ABCABCABC

ABCABC

A(B(CA))BCA(B(CA))49BC


(A1A2An)m(A1A2An)2
(A1A2An)2
GA1A2Gm1An


(AB)nABX×YY×XAB

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

X<YYX

X<Y
ABX×XAB(AB)n

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

ABCABC(ABC)n(ABC)nA(BCA)n1BCAB(CAB)n1C

@DavidRicherby는 사용에 대한 추가 비공식 증거입니까?
matteyas

@ matteyas : 내 질문에 대한 첫 번째 편집에서 내가 말한 것이 맞습니까?
pyon 2013 년

ABCABC

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.