Ürdün Ayrıştırması


18

Önemli not : Bu meydan okuma sadece kare matrisler için geçerli olduğundan, "matris" terimini her kullandığımda, bir kare matrise atıfta bulunduğum varsayılmaktadır. Ben kısaca aşk için "kare" açıklamasını bırakıyorum.

Arka fon

Determinantın hesaplanması, doğrusal bir sistemin çözülmesi veya skaler değerli fonksiyonların matrislere genişletilmesi gibi matrisle ilgili birçok işlem, benzer bir diyagonal matris (ana diyagonal üzerinde olmayan elemanları 0 olan) kullanılarak daha kolay hale getirilir orijinal matrise (giriş matrisi için anlamı Ave diyagonal matris D, bir ters çevrilebilir bir temel matris Pbu şekilde D = P^(-1) * A * P, aynı zamanda, Dve Aözdeğerler, belirleyici ve iz gibi bazı önemli özelliklere paylaşan). Ayrı öz değerleri ile matrislerin (çözme tarafından verilen matris karakteristik polinom, köklerden için det(A-λI) = 0için λ, Iaynı boyutlarda olarak kimlik matrisidir A), Diyagonalleştirme basittir:Dana köşegen üzerinde özdeğerleri Polan bir matristir ve bu özdeğerlere karşılık gelen özvektörlerden (aynı sırayla) oluşan bir matristir. Bu işleme öz-derleme denir .

Bununla birlikte, tekrarlanan özdeğerleri olan matrisler bu şekilde köşegenleştirilemez. Neyse ki, herhangi bir matrisin Ürdün normal formu oldukça kolay hesaplanabilir ve normal bir diyagonal matristen çalışmak çok daha zor değildir. Ayrıca, eğer özdeğerler benzersizse, Ürdün ayrışmasının öz-bileşim ile özdeş olması hoş bir özelliğe sahiptir.

Ürdün ayrışması açıklandı

AÖzdeğerlerinin tümü geometrik çokluğu 1 olan bir kare matris için Ürdün ayrıştırma işlemi şu şekilde tarif edilebilir:

  1. Izin vermek art arda tekrarlanan özdeğerleri ile, çokluk ile λ = {λ_1, λ_2, ... λ_n}özdeğerlerinin listesi olsun A.
  2. JÖğeleri λaynı sırayla öğeleri olan çapraz bir matris oluşturun .
  3. Çoğulluğu 1'den büyük olan her bir özdeğer için 1, özdeğerin tekrarlarının her birinin sağına J, sonuncusu hariç ana köşegenine yerleştirin .

Ortaya çıkan matris JÜrdün normal formudur A(belirli bir matris için özdeğerlerin sırasına bağlı olarak birden fazla Ürdün normal formu olabilir).

Çalışan bir örnek

Izin vermek Aaşağıdaki matris olmak:

Bir matris

AÇokluk ile özdeğerleridir λ = {1, 2, 4, 4}. Bunları köşegen bir matrise koyarak bu sonucu elde ederiz:

Adım 2

Sonra, 1s'yi tekrarlanan özdeğerlerin her biri hariç her birinin sağına yerleştiririz. Yana 4sadece tekrarlanan özdeğeridir, biz tek yerleştirmek 1ilk 4'e sonraki:

Ürdün formu

Bu Ürdün normal formudur A(tek bir matris potansiyel olarak birkaç geçerli Ürdün normal formuna sahip olabilir, ancak açıklama amacıyla bu ayrıntıyı inceliyorum).

Görev

AGirdi olarak bir kare matris verildiğinde , geçerli bir Ürdün normal formunun çıktısını alın A.

  • Giriş ve çıkış herhangi bir makul formatta olabilir (2B dizi / liste / her neyse, liste / dizi / sütun veya satır vektörleri, yerleşik matris veri türü, vb.).
  • Öğelerinin öğeleri ve özdeğerleri Aher zaman aralıkta tamsayılar olacaktır [-200, 200].
  • Basitlik adına, tüm özdeğerlerin geometrik çokluğu 1 olacaktır (ve dolayısıyla yukarıdaki süreç geçerlidir).
  • A en fazla 10x10 matris ve en az 2x2 matris olacaktır.
  • Özdeğerleri ve / veya özvektörleri hesaplayan veya özdepozisyon, Ürdün ayrışması veya başka herhangi bir tür ayrışma / köşegenleştirme gerçekleştiren yapılara izin verilmez. Matris aritmetiği, matris inversiyonu ve diğer matris yerleşiklerine izin verilir.

Test senaryoları

[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]

Yanıtlar:


4

Mathematica 140 139 105 bayt

Total[DiagonalMatrix@@@{{#},{1-Sign[Differences@#^2],1}}]&@(x/.Solve[#~CharacteristicPolynomial~x==0,x])&

Ben sadece DiagonalMatrix0s ve 1s superdiagonal boyunca yerleştirmek için kolay bir yol sağlar yerleşik bulundu .

kullanım

Misal


Ne olmuş Last@JordanDecomposition@#&? Yoksa aldatıyor mu?
Ruslan

@Ruslan Evet, kurallardan biri Ürdün ayrışımı yapan yapılara izin verilmemesidir. Yine de teşekkürler.
mil

2

Adaçayı, 79 bayt

lambda A:block_diagonal_matrix([jordan_block(*r)for r in A.charpoly().roots()])

Çevrimiçi deneyin

Başka hiç kimse çözüm göndermediğinden, devam edip bir tane de gönderebilirim.

A.charpoly.roots()karakteristik polinomunun A(yani özdeğer ve çoklukların) köklerini (ve cebirsel çokluklarını) hesaplar . jordan_blockverilen kök ve çokluktan bir Ürdün bloğu oluşturur. block_diagonal_matrixtam olarak Ürdün normal formunun tanımı olan diyagonal Ürdün blokları ile bir matris oluşturur.


2

J , 78 71 bayt

1(#\.|."_1#{."1],.2=/\,&_)@>@{[:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\

Çevrimiçi deneyin!

Bu görevin iki zorlu bölümü, özdeğerleri almak ve köşegenleştirmeyi gerçekleştirmek, her ikisinin de aynı sayıda bayt almasını sağlar. Bunlara kurallara izin verilmedi, ancak meraklı olması durumunda J, QR ayrışması ( 128!:0) için özlere ve özdeğerleri bulmak için kullanılabilecek LAPACK eklentilerine sahiptir.

Açıklama (Eski)

Bu fiilin iki ana bölümü vardır: özdeğerleri bulmak ve köşegenleştirmeyi gerçekleştirmek. İlk olarak, özdeğerleri bulmak için, giriş matrisi için karakteristik polinomun köklerinin bulunması gerekecektir. Örnekteki aynı giriş matrisini kullanarak,

   ] m =: _4 ]\ 5 4 2 1 0 1 _1 _1 _1 _1 3 0 1  1 _1 2
 5  4  2  1
 0  1 _1 _1
_1 _1  3  0
 1  1 _1  2

M matrisi için karakteristik polinom | M - λI | = 0 burada I , M ile aynı boyutlara sahip kimlik matrisidir . M - λI ifadesi , diyagonalde aksi takdirde 0 ise , M'deki her bir öğeyi bir -1 ile bokslayarak J'de modellenebilir. Her kutu, katsayı biçiminde bir polinomu temsil eder.

   (],&.>[:-@=#\) m
┌────┬────┬────┬────┐
│5 _1│4 0 │2 0 │1 0 │
├────┼────┼────┼────┤
│0 0 │1 _1│_1 0│_1 0│
├────┼────┼────┼────┤
│_1 0│_1 0│3 _1│0 0 │
├────┼────┼────┼────┤
│1 0 │1 0 │_1 0│2 _1│
└────┴────┴────┴────┘

J belirleyici olan -/ .*sayıları, kutulu değil polinomları çalıştığını, ancak. Çarpma yerine, evrişim ( [:+//.*/) kullanılarak bulunabilen polinom ürününe ihtiyaç vardır . Katlanmış çıkarma hala kullanılmaktadır ve bu fiillerin her ikisi de ( &.) unbox ( >) altında kullanılacak şekilde kutular içinde çalışmalıdır .

   ([:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌───────────────┐
│32 _64 42 _11 1│
└───────────────┘

Bunlar karakteristik polinomun katsayılarıdır. Kökler, p.bir polinomun katsayılar ve kökler arasındaki temsilini dönüştüren kullanılarak bulunabilir .

   ([:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌─┬───────┐
│1│4 4 2 1│
└─┴───────┘

Kökler [4, 4, 2, 1]ve bunlar M'nin özdeğerleridir .

İkincisi, köşegenleştirme yapılmalıdır. Her sürekli değer çifti eşitlik açısından test edilir.

   (2=/\]) 4 4 2 1
1 0 0

Bir sıfır eklenir ve bu değerler özdeğerlerle birlikte sütunize edilir.

   (],.0,~2=/\]) 4 4 2 1
4 1
4 0
2 0
1 0

Daha sonra her sıra, bir kare matris oluşturmak için özdeğer sayısı ile aynı uzunlukta doldurulur.

   (#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
4 0 0 0
2 0 0 0
1 0 0 0

Sonunda her sıra sağa kayıyor ve sıfırlar sola itiliyor. İlk satır sıfır kez, ikincisi bir kez, üçüncüsü iki kez kaydırılır.

   (-@i.@#|.!.0"_1#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
0 4 0 0
0 0 2 0
0 0 0 1

Çıktı M'nin Ürdün ayrışmasıdır .



1

MATL , 29 bayt, rakip olmayan

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

Çevrimiçi deneyin!

Bu benim ilk MATL sunumum, bu yüzden iyileştirmeler gerekiyor. Bunu öğrenme ve sadece sonunda ben bu olabilir 7 Mayıs 2016 Emin yeterli olmaktan Matl kullanılarak çalıştık değil unutmayın yaptı ise bir geçirdi, ben sondan bir önceki kontrol işlemek o güne ve yayınlanmamasını etmedi.

Kullandığım isterdi diagama Matl sadece tek argüman sürümünü destekler görünüyor. İkinci argümanın, değerleri süper eksenel (veya farklı problemler için herhangi bir diyagonal) boyunca yerleştirmek gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.