2012-10-07 7 views

cevap

3

Düzenleme yapabilirsiniz ... senin seyrek matrisler üzerinde MLDIVIDE (\) veya MRDIVIDE (/) kullanabilirsiniz Bunun için sıradan MATLAB ters eğik çizgi \ operatörünü kullanın:

orijinal cevapta belirtildiği üzere
x = U\b 

, MATLAB sizin matris üçgen olduğu gerçeğini kabul edecektir. Bundan emin olmak için, performansı SuiteSparse'da bulunan cs_usolve prosedürüyle karşılaştırabilirsiniz. Üst üçgen üçgen seyrek matris için seyrek üçgensel çözelti hesaplayan C biçiminde uygulanan bir mex işlevidir (burada da benzer işlevler vardır: cs_lsolve, cs_utsolve ve cs_ltsolve).

Seyrek Cholesky factorization bağlamında performance comparison doğal MATLAB ve cs_l(t)solve'a bakabilirsiniz. Esasen, MATLAB performansı iyidir. Eğer

x = U'\b 

MATLAB değil kabul etmez bir aktarılmamıştır sistemini çözmek istiyoruz ve açıkça U bir devrik oluşturursa Sadece hatadır olduğunu. Bu durumda, cs_utsolve'u açıkça aramalısınız.

Orijinal cevap sistem simetriktir ve sadece chol simetrik matrisleri kolları, (yani ben sorunuzu tam anladılar) ve Choleskey çözümleme sizin için uygun olup olmadığını üst üçgen matris kısmı saklıyorsanız, matrisiniz pozitif ise kesin. Belirsiz matrisler için ldl'u kullanabilirsiniz. Her ikisi de seyrek depolama tutar ve simetrik matris parçaları üzerinde çalışır.

Daha yeni matlab sürümleri bunun için cholmod and suitesparse kullanın. Bu, bildiğim en iyi performansa sahip Cholesky factorization. Matlabda da paralel BALS ile paraleldir.

Yukarıdaki işlevler elde faktör

A=LL' 

şimdi yapmak gereken ileri almak şekilde üst üçgen matris, L ve basit ve ucuz geri değiştirmedir. Matlab bu otomatik tha eğik çizgi operatör

x=L'\(L\b) 

matris seyrek olabilir ve Matlab o/alt üçgen üst olduğunu anlayacaktır yapılır. Ayrıca, bu aramayı, kolesky factorization kullanılarak elde edilen faktörler için ileri ikame ile birlikte kullanacaksınız.

+2

Sanırım “A = triu (...)” (tam) vs A = seyrek (triu (...)) '(seyrek) –

+0

@RodyOldenhuis Oh, şimdi tekrar okudum sanırım haklısınız . Ama yine de cevabım üçgen çözme hakkında bilgi içerir (geri/ileri ikame) - sonunda bu matrisinizi faktörize ettikten sonra ne yaparsınız :) – angainor

1

ne ihtiyacınız da geri/ileri ikame denilen bir üçgen çözmek prosedür olduğundan,

4

UT ve LT sistemleri, çözülmesi en kolay sistemler arasındadır. Bu konuda on the wiki okundu.

%# some example data 
A = sparse(triu(rand(100))); 
b = rand(100,1); 

%# solve UT system by back substitution  
x = zeros(size(b)); 
for n = size(A,1):-1:1  
    x(n) = (b(n) - A(n,n+1:end)*x(n+1:end))/A(n,n);  
end 

prosedür LT sistemleri için oldukça benzer: Bunu bilerek, kendi UT veya LT çözücüsü yazmak kolaydır.Nate zaten belirtildiği gibi, aynı zamanda, yedek parçalar matrisleri için çalışır

x = A\b 

:

o Matlab'ın ters eğik çizgi operatörü kullanmak genellikle çok daha kolay ve hızlıdır, Having.

Bu işleç ayrıca, kare olmayan A olan UT sistemlerini veya A ana köşegende bazı öğelerin sıfıra eşit (veya < eps) olduğunu da unutmayın. Bu vakaları sizin için arzu edilen veya olmayabilecek en küçük kareler anlamında çözer.

>> help \ 

veya

Matlab komut istemine üzerinde
>> help slash 

yazarak

if size(A,1)==size(A,2) && all(abs(diag(A)) > eps) 
    x = A\b; 
else 
    %# error, warning, whatever you want 
end 

(arka) hakkında daha fazlasını okuyun operatörü çizgi: Sen çözmek gerçekleştirmeden önce bu durumlar için kontrol edebilir .

+0

Tabii ki bu geri ikameyi kendim uygulayabilirim, açık olduğunu düşündüm :) Sorun, çok yavaş oldukları için, for döngülerinin genellikle matlabda önlenmesidir. Eğik çizgi işlemi, üçgen matrisler için geri değiştirme kullanımını garantiledi mi? – olamundo

+0

@noam: Bir göz atın [burada] (http://scicomp.stackexchange.com/questions/1001/how-does-the-matlab-backslash-operator-solve-ax-b-for-square-matrices). –

+1

\ bir ters eğik çizgi veya sol bölümdür ('mldivide'),'/'bir eğik çizgi veya sağ bölme (' mrdivide'). – angainor