LAPACK ve BLAS kullanarak


12

C ++ için MATLAB mevcut bir kodu taşıma ve çözmek için bir lineer sistem bilgisi am (yerine daha tipik bir şekilde daha A x = b )xbir=bbirx=b

matrisi yoğun ve genel formda olmakla birlikte 1000x1000'den daha büyük değildir. MATLAB'da çözüm, işlev veya eğik çizgi işareti ile bulunurbirmrdivide(b,A)x = b/A;

BLAS ve LAPACK yordamlarını kullanarak bu C ++ kodumda nasıl çözmeliyim?

Ben LAPACK rutin aşina olduğum DGESVçözer için x .birx=bx

Yani, düşündüğüm bir şey, matris devrik kimliklerini kullanarak bazı manipülasyonlar yapmaktır:

(xbir)T=bT

birTxT=bT

xT=(birT)-1bT

Sonra DGESVtranspozisyon üzerinde çalışarak nihai formu çözmek . (bu yüzden A'yı aktarmanın maliyeti ve sistemi çözmenin maliyeti)birTbir

Daha verimli veya daha iyi bir yaklaşım var mı ?

Ben matris ve vektör sınıfları yanı sıra BOOST uBLAS kitaplığından BLAS uygulaması yanı sıra LAPACK kitaplığı rutinleri için bağları ile çalışıyorum. Bu kurulumu diğer işlemler için başarıyla kullanıyorum ve bu kütüphanelerle sınırlı bir çözüm bulmayı umuyorum.

Ayrıca, kod kurulumu sırasında yalnızca birkaç kez bu tür bir işlem gerçekleştirdiğimi, bu yüzden performans kritik bir endişe olmadığını not etmeliyim.

Belki bu MATLAB belgeleri üzerinde mrdividediğerleri için yararlıdır.

Yanıtlar:


10

İçin Önemsiz cevap kare : kullanımı da ilişkin olan çözer bir T x = b .birdgesvxbirTx=bTRANS = 'T'

BLAS veya LAPACK ile, bir matrisi aktarmanız (hafızadaki öğeleri değiştirmemeniz) gerekmediğini lütfen unutmayın: altyordamların çoğunun TRANS, transpoze matrisinde veya farklı bir bellek yerleşimi ile saklanan bir matris üzerinde çalışacak bir argümanı vardır. (Transpozisyon, Fortran bitişik bellek düzenini C-contiguos bir ve viceversa olarak değiştirmeye eşdeğerdir.)


Yanıt ve açıklama için teşekkürler! LAPACK ile çok az iş yaptım ve şimdi TRANS seçeneğini aramayı biliyorum. TRANS argümanını çözmek için sorun yaşıyorum boost::numeric::bindings::lapack::gesvx(), ama bu benim sorumun bir parçası değil. Başarıya ulaşırsam, nasıl yapılacağına dair bir notla geri döneceğim.
NoahR

gesvx()gesvxbirTX=BbirTXT=BTXBbirXBdeğiller. Harika, bu daha uygun. Eğer kimse destekleyici sayısal bağları kullanmaya çalışırken tökezliyorsa, ben bu soln kullanılan devrik arayüzü alamadım diyorum. ciltler üzerinde çalışmak.
NoahR

gesvxboost::numeric::bindingsbirTtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );

0

bir

xbir=bxSR,=bx=bR,-1ST

bir


3
birR,R,-1
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.