Perkalian dan eksponensial rantai matriks

13

Jika saya memiliki dua matriks dan B , masing-masing berdimensi 1000 × 2 dan 2 × 1000 , dan ingin menghitung ( A B ) 5000 , lebih efisien untuk terlebih dahulu menulis ulang ekspresi sebagai A ( B A ) 4999 B dan baru kemudian mengevaluasi secara numerik, karena A B adalah dimensi 1000 × 1000 tetapi B A adalah dimensi 2 × 2 .AB1000×22×1000(AB)5000A(BA)4999BAB1000×1000BA2×2

Saya ingin menyelesaikan versi umum masalah ini. Apakah ada algoritma yang cukup efisien (bukan kekerasan) untuk mengoptimalkan ekspresi yang mengandung:

  • Variabel matriks bebas dari dimensi yang diketahui
  • Produk dari subekspresi sewenang-wenang
  • Subekspresi sewenang-wenang dinaikkan menjadi kekuatan alami

... sehingga dibutuhkan paling sedikit pekerjaan untuk mengevaluasi secara numerik, setelah mengganti variabel matriks bebas dengan nilai matriks konkret?

Masalah penggandaan rantai matriks adalah kasus khusus dari masalah saya.


Edit:

Ini adalah jawaban sementara. Tampaknya secara intuitif benar bagi saya, tetapi saya tidak punya bukti bahwa itu benar. Jika ternyata benar, saya masih tertarik pada buktinya. (Jika itu tidak benar, tentu saja, tolong perbaiki saya.)

Untuk setiap produk yang dinaikkan menjadi daya, katakanlah, , pertimbangkan setiap permutasi siklik faktor-faktor:(A1A2Ak)n

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

... secara rekursif. Setiap daya dihitung menggunakan eksponensial dengan mengkuadratkan (jelas), dan semua produk lain dihitung menggunakan urutan optimal yang dikembalikan oleh algoritma penggandaan rantai matriks.


Edit:

Gagasan yang diuraikan dalam edit saya sebelumnya masih agak tidak optimal. Eksponen dengan algoritma kuadrat sebenarnya mengevaluasi ekspresi dari bentuk atau A n K , di mana K belum tentu merupakan matriks identitas. Tapi algoritma saya tidak mempertimbangkan kemungkinan menggunakan eksponensial dengan mengkuadratkan algoritma dengan K tidak sama dengan matriks identitas.KAnAnKKK

ular sanca
sumber
@ gnasher729: Maaf, saya seharusnya lebih eksplisit. Saya tidak ingin memaksa semua kemungkinan, untuk alasan yang persis sama Anda tidak ingin menyelesaikan perkalian rantai matriks dengan kekuatan kasar. Saya baru saja mengedit pertanyaannya.
pyon
Perhatikan bahwa bahkan setelah Anda cerdik ekspresi faktor masih lebih pintar faktor sebagai A ( B A ) 2 * ( 2 * 1249 + 1 ) + 1 B . Intinya adalah, Anda mungkin harus mencampur antara perkalian rantai matriks dan algoritma standar lainnya untuk eksponensial cepat. A(BA)4999B
A(BA)2(21249+1)+1B
Apiwat Chantawibul
@ Billiska: Memang, itulah yang ingin saya lakukan: menggabungkan perkalian dan eksponensiasi rantai matriks dengan mengkuadratkan ke dalam algoritma tunggal untuk masalah gabungan. Tetapi ada beberapa masalah sial. Diberikan , bagaimana saya mencegah algoritma untuk mencoba A B ( A B ) n - 2 A B , A B A ( B A ) n - 3 B A B , dan seterusnya? A(BA)n1BAB(AB)n2ABABA(BA)n3BAB
pyon
Kami mengubah basis menjadi vektor Eigen untuk eksponensial matriks dan ketika semua matriks memiliki kekuatan 1 maka kita dapat menggunakan perkalian rantai matriks.
Deep Joshi
@DeepJoshi Maaf, saya menemukan komentar Anda agak singkat. Tapi, jika saya memahami ide Anda dengan benar, aku takut itu tidak akan bekerja dalam kasus umum, karena dimensi ruang eigen dari matriks kebutuhan tidak menambahkan hingga n . Dengan kata lain, tidak selalu demikian bahwa setiap vektor dapat dinyatakan sebagai kombinasi linear dari vektor eigen. n×nn
pyon

Jawaban:

3

Penafian: Metode berikut ini belum terbukti secara optimal. Bukti informal disediakan.

Masalahnya berkurang untuk menemukan pemesanan yang paling efisien ketika mempertimbangkan kuadrat produk.

(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

Menggunakan lebih banyak matriks, argumennya serupa. Mungkin bukti induktif mungkin? Gagasan umum adalah bahwa memecahkan MCM untuk kuadrat akan menemukan ukuran optimal untuk operasi dengan semua matriks yang terlibat dipertimbangkan.

Studi kasus:

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)
matteyas
sumber
1
(ABC)2
ABCABC(ABC)n(ABC)nA(BCA)n1BCAB(CAB)n1C
@DavidRicherby adalah bukti informal tambahan yang digunakan?
matteyas
@matteyas: Itu kurang lebih apa yang saya katakan di edit pertama pertanyaan saya, kan?
pyon
ABCABC