2009-08-04 9 views
8

Czy doładowanie ma jeden? Gdzie A, Y i X to odpowiednio macierz (rzadka i może być bardzo duża) oraz wektory. Albo y lub x mogą być nieznane.Roztwór liniowej algebry Boost dla y = Siekiera

ja nie potrafię go znaleźć tutaj: http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

+2

Ponieważ nic nie wiem o Boost lub C++, po prostu zaznaczę, że istnieje rozwiązanie wtedy i tylko wtedy, gdy A jest odwracalną macierzą. Jeśli A nie jest odwracalne, to rozwiązanie najmniejszych kwadratów x = (A^T A)^(- 1) A^T y jest najbliższą rzeczą. –

+4

to na ogół nie jest tak, jak rozwiązywane są równania macierzy (odwrotności są generalnie złe, zarówno dla stabilności liczbowej, jak i dla prędkości), raczej zobaczysz współczynnik rozkładu QR lub LU, po czym nastąpi substytucja wsteczna. –

Odpowiedz

4

rozwiązują liniowe są zwykle częścią biblioteki Lapack który jest wyższy poziom rozszerzenie biblioteki Blas. Jeśli korzystasz z Linuksa, Intel MKL ma kilka dobrych rozwiązań, zoptymalizowanych zarówno dla gęstych, jak i rzadkich macierzy. Jeśli jesteś w oknach, MKL ma miesięczny okres próbny za darmo ... i szczerze mówiąc nie wypróbowałem żadnego innego. Wiem, że pakiet Atlas ma darmową implementację LAPACK, ale nie wiem, jak trudno jest uruchomić system Windows.

W każdym razie, poszukaj biblioteki LAPACK, która działa w Twoim systemie.

+4

Uwaga: LAPACK nie jest solwerem rozproszonym, więc nie przechowuje bardzo wydajnych macierzy rzadkich, ani nie rozwiązuje szczególnie wydajnie systemów rzadkich. Intel MKL zawiera rzadkie solwery (http://software.intel.com/sites/products/collateral/hpc/mkl/mkl_brief.pdf), w szczególności bezpośredni solver PARDISO (http: //www.pardiso-project .org). Dobry przegląd gęstego i rzadkiego oprogramowania do numerycznej algebry liniowej można znaleźć pod adresem http://www.netlib.org/utk/people/JackDongarra/la-sw.html – las3rjock

+0

Rzeczywiście tak, i jeśli nie budujesz komercyjnego produktu, sugerowałaby rezygnację z biblioteki MKL i po prostu uzyskanie PARDISO, zaoszczędzisz pieniądze i zaoszczędzisz kłopotów z licencjonowaniem. – DeusAduro

3

Podczas czytania dokumentacji doładowania nie wydaje się, aby zaimplementowano rozwiązanie w.r.t x. Rozwiązywanie w y jest tylko kwestią produktu macierzy-wektora, który wydaje się zaimplementowany w ublach.

Trzeba pamiętać, że blas realizuje tylko "proste" operacje, takie jak dodawanie, mnożenie itp. Typów wektorowych i macierzy. Coś bardziej zaawansowanego (liniowe rozwiązywanie problemów, takie jak "rozwiń w x y = A x", wektory własne i współ) jest częścią LAPACK, które zbudowano na bazie BLAS. Nie wiem, co zapewnia w tym względzie zwiększenie.

3

Strojenie liniowej algebry Boosta skoncentrowane na "gęstych matrycach". O ile mi wiadomo, pakiet Boost nie ma żadnego solwera systemu liniowego. Co powiesz na użycie kodu źródłowego w "Recepturze numerycznej w C (http://www.nr.com/oldverswitcher.html)"?

Uwaga. W kodzie źródłowym może występować subtelny błąd indeksu (w niektórych kodach indeks tablicy zaczyna się od 1)

+0

+1 dzięki za link. –

+1

To nie jest błąd, to funkcja! Dzięki temu algorytmy stały się bardziej smaczne dla użytkowników Fortran. –

3

Zobacz JAMA/TNT. Używałem go tylko dla niezespolonych macierzy (prawdopodobnie chcesz, aby były to repozytorium QR lub LU, z których oba mają metody narzędziowe solver), ale najwyraźniej ma ono pewne zalety dla rzadkich macierzy.

4

Jeden z najlepszych solverów dla Ax = b, gdy A jest rzadki, jest Tim Davisa UMFPACK

UMFPACK oblicza rzadki LU dekompozycji A. Jest to algorytm, który przyzwyczaja się za kulisami w Matlab kiedy wpisujesz x=A\b (i A jest rzadki i kwadratowy). UMFPACK to wolne oprogramowanie (GPL)

Należy również zauważyć, że jeśli y = Topór i x jest znany, ale y nie jest, to oblicza się je, wykonując pomnożony wektor macierzy, a nie rozwiązując układ liniowy.

17

tak, można rozwiązywać równania liniowe z biblioteką ublas boost. Oto jeden krótki sposób korzystania LU-na czynniki i back-podstawiając uzyskać odwrotność:

using namespace boost::ublas; 

Ainv = identity_matrix<float>(A.size1()); 
permutation_matrix<size_t> pm(A.size1()); 
lu_factorize(A,pm) 
lu_substitute(A, pm, Ainv); 

Tak aby rozwiązać układ liniowy Ax = y, to można rozwiązać równanie trans (A) Ax = trans (A) y biorąc odwrotność (trans (A) A)^- 1, aby uzyskać x: x = (trans (A) A)^- 1Ay.

+10

Jeśli potrzebujesz tylko rozwiązania dla Ax = y, po prostu użyj 'permutation_matrix pm (A.size1()); lu_factorize (A, pm); lu_substitute (A, pm, y); 'i' y' zastępuje się rozwiązaniem. – Joey

Powiązane problemy