x = A\b
için, backslash operatörü, farklı giriş matrislerini işlemek için bir dizi algorithms'u kapsar. Böylece A
matrisi teşhis edilir ve özelliklerine göre bir yürütme yolu seçilir.
kare olmayan matrisler için
if size(A,1) == size(A,2) % A is square
if isequal(A,tril(A)) % A is lower triangular
x = A \ b; % This is a simple forward substitution on b
elseif isequal(A,triu(A)) % A is upper triangular
x = A \ b; % This is a simple backward substitution on b
else
if isequal(A,A') % A is symmetric
[R,p] = chol(A);
if (p == 0) % A is symmetric positive definite
x = R \ (R' \ b); % a forward and a backward substitution
return
end
end
[L,U,P] = lu(A); % general, square A
x = U \ (L \ (P*b)); % a forward and a backward substitution
end
else % A is rectangular
[Q,R] = qr(A);
x = R \ (Q' * b);
end
, QR decomposition kullanılır: A
tam matris olduğunda
aşağıdaki page sözde kod tarif etmektedir. Kare üçgen matrisler için basit bir forward/backward substitution gerçekleştirir. Kare simetrik pozitif kesin matrisler için, Cholesky decomposition kullanılır. Aksi halde genel kare matrisler için LU decomposition kullanılır.
Güncelleme: MathWorks bazı güzel akış çizelgeleri ile mldivide
ait doc sayfasında algorithm section güncelledi. Bkz. here ve here (tam ve seyrek durumlar).
bu algoritmaların tamamı
LAPACK karşılık gelen yöntemler var ve aslında MATLAB ne yaptığını muhtemelen (optimize
Intel MKL uygulaması ile MATLAB geminin o son sürümlerini dikkat edin).
Farklı yöntemlere sahip olmanın nedeni, katsayı matrisinin tüm özelliklerinden yararlanan denklemler sistemini çözmek için en spesifik algoritmayı kullanmaya çalışmasıdır (daha hızlı veya daha sayısal olarak kararlı olması nedeniyle). Yani kesinlikle bir genel çözücü kullanabilirsiniz, ama en verimli olmayacaktır.
Aslında, A
'un neye benzediğini biliyorsanız, linsolve
numaralı telefonu arayarak ve seçenekleri doğrudan belirterek ek test işlemini atlayabilirsiniz. , Yukarıdakilerin hepsi yoğun matrisleri için geçerlidir
x = pinv(A)*b
:
A
eğer siz de en az kareler çözeltisi (SVD decomposition kullanılarak uygulanır) minimal bir normunu bulmak için PINV kullanabilir, dikdörtgen ya da tekil olduğu seyrek matrisler tamamen farklı bir hikaye. Bu tür durumlarda genellikle iterative solvers kullanılır. MATLAB'ın, doğrudan çözücüler için SuiteSpase paketinden UMFPACK ve diğer ilgili kitaplıkları kullandığını düşünüyorum.seyrek matrisler ile çalışırken
, sen spparms
kullanılarak seçilen gerçekleştirilen testleri ve algoritmalar tanılama bilgilerini açıp görebilirsiniz:
spparms('spumoni',2)
x = A\b;
Dahası
, ters eğik çizgi operatörü ayrıca gpuArray 's çalışır, Bu durumda, GPU üzerinde yürütmek için cuBLAS ve MAGMA'a güvenir.
Ayrıca dağıtılmış bilgi işlem ortamlarında çalışan (her bir işçinin dizinin yalnızca bir parçasının bulunduğu bir kümelenme kümesine bölünmüş çalışma, muhtemelen tüm matrisin bellekte aynı anda depolanamadığı) distributed arrays için uygulanır. Temel uygulama, ScaLAPACK kullanıyor. Bunların tümü uygulamak istiyorsanız oldukça istek bu
Kendinizi :)
Çok basit değil ve ben denemeye karşı son derece öneriyoruz. Sadece LAPACK'ın DGEMV'sine bağlanın. Bir sürü akıllı insan çok fazla zaman harcayarak 'mldivide' ayarladı. –
Benzer soru: [MATLAB backslash operatörü, kare matrisler için Ax = b nasıl çözülür?] (Http://scicomp.stackexchange.com/questions/1001/how-does-the-matlab-backslash-operator-solve-ax -b-for-kare matrisler) – Amro
@Amro, woohoo Sorum. LOL –