aynı


12

MATLAB'ı, b'nin zamanla değiştiği her zaman aralığında çözmeyi içeren bir sorunu çözmek için kullanıyorum . Şu anda bunu MATLAB'ları kullanarak gerçekleştiriyorum :Ax=bbmldivide

x = A\b

Gerektiği kadar ön hesaplama yapma esnekliğine sahibim, bu yüzden daha hızlı ve / veya daha doğru bir yöntem olup olmadığını merak ediyorum mldivide. Burada tipik olarak ne yapılır? Herkese teşekkürler!


1
yapısı hakkında özel bilginiz var mı? Mesela simetrik mi? Olumlu kesin mi? Tridiagonal? Dikey? A
Dominique

matrisi yoğun bir kare matristir. A
Şüphe

3
Eğer başka hiçbir bilgiye sahip değilse , L , U cevap açıklandığı gibi çarpanlara alt kısmında en iyi bahistir. ALU
Dominique

Yanıtlar:


14

Yapabileceğiniz en belirgin şey önceden hesaplamaktır

[L,U] = lu(A) ~ O (n ^ 3)

O zaman sadece hesapla

x = U \ (L \ b) % O (2 n ^ 2)

Bu, maliyeti büyük ölçüde azaltacak ve daha hızlı hale getirecektir. Doğruluk aynı olurdu.


1
Not gelen belgeleri , L mutlaka daha düşük bir üçgen değildir. Bu cevap muhtemelen doğrudan bir çözümden daha hızlı olacaktır, ancak L \ b komutunun L'yi doğru sırayla çözmeyi bilecek kadar akıllı olduğundan emin olmak için dikkatli olurum (muhtemelen, ancak kesin olarak söylemez) belgelerinde).
Godric Seer

Evet haklısın, L düşük üçgen bir matris ve permütasyon matrisinin ürünüdür. Ama tek yapması gereken geriye doğru ikame olduğunu fark etmezse lanetleneceğim L\b. Çünkü bu tam çizginin uzmanları düşündüğüm kişiler tarafından yüksek performanslı kodda kullanıldığını gördüm.
Milind R

8
O(n2)

1
A

3
@BrianBorcher Bildiğim kadarıyla, permütasyonu takip etmenin en iyi yolu dokümanlardaki[L,U,p] = lu(A,'vector'); x = U\(L\b(p)); 3. örneğe bakın . lu
Stefano M

5

Bu konuyla ilgili bilimsel bilgi işlem kurslarımızda bazı kapsamlı bilgisayar laboratuarları yaptık. Orada yaptığımız "küçük" hesaplamalar için, Matlab'ın ters eğik çizgi operatörü, kodumuzu mümkün olduğunca optimize ettikten ve tüm matrisleri önceden yeniden sıraladıktan sonra bile (örneğin seyrek matrisler için Ters Cuthill McKee ile) her zaman her şeyden daha hızlıydı. .

Laboratuar talimatlarımızdan birine göz atabilirsiniz . Sorunuzun yanıtı (kısa bir süre içinde) sayfa 4'te ele alınmıştır.

Konu hakkında iyi bir kitap örneğin Cheney tarafından yazılmıştır .


4

An×n Axi=bii=1mm

V = inv(A);
...
x = V*b;

O(n3)inv(A)O(n2)V*bm

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

Bazı notlar

Kararlılık ve hata analizi için lütfen bu farklı cevaba , özellikle de VictorLiu'nun cevabına bakınız.

mn

Zamanlama, oldukça sabit bir UNIX yük ortalaması 5 olan 12 çekirdekli bir bilgisayarda Matlab R2011b ile gerçekleştirildi; tic, tocüç probun en iyi zamanı.


Gerçekten de, bir matris-vektörde bir üçgen çözücüden çok daha fazla paralellik vardır, bu nedenle hesaplamalar herhangi bir şekilde paralel (çoklu çekirdek / GPU / vb ...) yapılırsa bu daha da belirgin olmalıdır.
Aron Ahmadia

@AronAhmadia Kabul ediyorum: sadece işlem sayısına dayalı başabaş noktası tahminleri sadece seri uygulama için anlamlıdır.
Stefano M

1
A matrisi seyrek ise, işlerin büyük ölçüde farklı olacağını unutmayın; tersi tipik olarak oldukça yoğun olurken, LU faktörleri tipik olarak makul derecede seyrektir ve şeyleri LU yönünde daha hızlı döndürür.
Brian Borchers

1
A

1
inv(A)Ax=bbBA\B

2

Bu soruya bir göz atın , cevaplar mldivideoldukça zeki olduğunu gösteriyor ve aynı zamanda Matlab'ın çözmek için ne kullandığını görmek için öneriler sunuyor A\b. Bu size optimizasyon seçenekleri hakkında bir ipucu verebilir.


0

Ters eğik çizgi kullanmak aşağı yukarı eşittir inv(A)*B, eğer özgürce kodluyorsanız, ikincisi daha sezgisel olabilir. Matlab belgelerini kontrol etmek için yine de aynıdırlar (hesaplamanın nasıl yapıldığından farklıdırlar).

Sorunuzu cevaplamak için ters eğik çizgi genellikle iyidir, ancak kütle matrisinin özelliklerine bağlıdır.


1
Matematiksel olarak inv (A) * b \ ile aynıdır ancak sayısal olarak aslında tersi oluşturmak hem daha az verimli hem de daha az doğrudur. Doğrusal cebiri öğrenmek için çalışıyorsanız, bu kabul edilebilir olabilir, ancak tersi oluşturmak için çok iyi bir nedene ihtiyacınız olduğunu iddia ediyorum.
Godric Seer

Ama neden inv(A)tek başına bu kadar pahalı olduğundan neden hesaplasın ki A\b?
Dominique

7
@Godric: Yeni bir kağıt var olduğunu tartışmaktadır inv (A) * ş az doğru olduğunu "efsane": arXiv üzerinde . Gerçek tersi hesaplamak için genellikle bir neden olduğunu söylememek, ama sadece söylemek.
Victor Liu

3
@Dominique: Üçgen çözücüler, matris-vektör çarpımından çok daha az paralelleştirilebilir ve sofistike önkoşullu yinelemeli yöntemler genellikle alt etki alanlarındaki doğrudan yöntemleri kullanır. Paralelliği geliştirmek için birkaç mütevazı boyutta yoğun üçgen matrisin tersini açık bir şekilde oluşturmak genellikle yararlıdır.
Jack Poulson

@VictorLiu: Makale için teşekkür ederim. Doğruluk beyanımda düzeltilmiş duruyorum (en azından inv (A) 'nın akıllı uygulamaları için).
Godric Seer
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.