Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Dzielenie macierzy przez wektor

Ostatnio zmodyfikowano 2014-10-28 09:49
Autor Wiadomość
scartout
Temat założony przez niniejszego użytkownika
[C++] Dzielenie macierzy przez wektor
» 2014-10-21 19:30:00
Witam.
Pytanie przede wszystkim dla obeznanych forumowiczów: czy istnieje jakiś biblioteka\moduł do doinstalowania do Dev-C++ lub Code:Blocks'a dzięki któremu można byłoby, tak jak np. w Scilabie, prosto dzielić macierz przez wektor aby otrzymywać rozwiązania? Podczas poszukiwań na www widziałem chyba coś podobnego ale nie jestem w stanie teraz tego ponownie odnaleźć. Chodzi mi mianowicie o takie działanie:

A=[1,2,3;4,5,6;7,8,9]
B=[1;2;3]
X=A/B

Z góry dziękuje za odpowiedź! :)
P-119175
Monika90
» 2014-10-21 19:43:01
biblioteka Eigen eigen.tuxfamily.org/
P-119176
SocrateZ
» 2014-10-22 08:42:40
Wektor to też macierz. Żeby podzielić dwie macierze po prostu mnożysz pierwszą przez odwrotność drugiej. Nie trzeba do tego żadnych bibliotek.

http://pl.wikipedia.org/wiki​/Mnożenie_macierzy
http://pl.wikipedia.org/wiki​/Macierz_odwrotna

EDIT:
Tu masz dokładnie jak wyliczyć macierz odwrotną:
http://math.uwb.edu.pl​/~randrusz/alglin/macodwr.pdf
P-119196
scartout
Temat założony przez niniejszego użytkownika
» 2014-10-22 15:56:47
Dziekuję za odpowiedzi!

Z tym mnożeniem przez odwrotność to wiedziałem przed założeniem tematu i dlatego go założyłem :) . Musiałbym sporo dopisać kodu (metoda Gaussa i podobne), a uzyskiwanie odpowiedzi za pomocą X=A/B tak jak w SciLabie jest prostsza. Poza tym X=A/B jest tylko małym elementem programu nad którym pracuję.

Sprawdziłem bibliotekę Eigen. Potrafi pomnożyć, podzielić przez skalar a nie potrafi, jak poniżej podzielić macierzy przez wektor. Jak to podzielić?

To co napisałem (ale nie działa) :

C/C++
#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main() {
    Eigen::Matrix3d m;
    Eigen::Vector3d n( 1, 2, 3 );
   
    m << 1, 2, 3,
    4, 5, 6,
    7, 8, 9;
   
    cout << m << endl;
    cout << n << endl;
    cout << m / n << endl; //nie działa
}
[ \c pp ]
P-119202
Monika90
» 2014-10-22 19:03:30
A dlaczego chcesz dzielić macierz przez wektor? Wektor nie jest macierzą kwadratową więc nie ma odwrotności. No chyba że chodzi Ci o http://en.wikipedia.org/wiki​/Moore%E2%80%93Penrose_pseudoinverse
P-119214
scartout
Temat założony przez niniejszego użytkownika
» 2014-10-22 19:16:47
Konkretnie chodzi mi o rozwiązywanie równań liniowych czyli dokładniej X=A^-1 * B, czyli macierz odwrotna do A * wektor B. Chcę liczyć na tej samej zasadzie jak w SciLabie wpisujemy X=A/B i otrzymujemy odpowiedzi.
P-119215
Monika90
» 2014-10-22 21:29:19
Rozwiązać układ równań liniowych można tak
C/C++
#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main() {
    Eigen::Matrix3d m;
    Eigen::Vector3d n( 1, 2, 3 );
   
    m << 1, 2, 3,
    4, 5, 6,
    7, 8, 9;
   
    cout << m << endl;
    cout << n << endl;
    cout << m.colPivHouseholderQr().solve( n ) << endl;
}
P-119232
scartout
Temat założony przez niniejszego użytkownika
» 2014-10-23 09:23:48
Dzięki za odpowiedź! Faktycznie rozwiązywanie układów działa, ale to nie koniec problemów :) Podałbym od razu ten przykład gdybym wiedział że będzie z nim problem. Program ma rozwiązywać konkretnie układ tego typu (nie jestem z tym obeznany z innymi bibliotekami więc proszę o poprawienie):


C/C++
#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main() {
    Eigen::Matrix3d m;
    Eigen::Vector3d n( - 1, - 4, - 5, - 11, - 9 );
   
    m << 1, 0, 0, 1, 0, 0,
    1, 0, 0, 0, 1, 0,
    0, 1, 0, 0, 1, 0,
    0, 1, 0, 0, 0, 1,
    0, 0, 1, 0, 0, 1;
   
    cout << m << endl;
    cout << n << endl;
    cout << m.colPivHouseholderQr().solve( n ) << endl; //nie działa gdy m>n
}
[ \c pp ]
P-119246
« 1 » 2
  Strona 1 z 2 Następna strona