Pokaż wyniki 1 do 8 z 8

Temat: Lapack w c++

  1. #1
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie Lapack w c++

    Witam!

    Chcialabym wykorzytc biblioteke Lapac w C++, w celu znalezienia f. wlasnych i w. wlasnych.

    Problem udalo mi sie rozwiazac.

    Jednakze mam pytanie odnosnie alkoacji pamieci w C.

    Mam taka postac:
    double complex *WORK = (double complex*)malloc( LWORK*sizeof(double complex));

    double complex *RWORK = (double complex*)malloc( 2*N*sizeof(double complex));

    Czy odpowienik tego zapisu w C++ jest nastepujacy:
    double complex *WORK = new double complex ( LWORK*sizeof(double complex));

    double complex *RWORK = new double complex ( 2*N*sizeof(double complex));
    Ostatnio edytowane przez Gosik : 05-22-2013 - 23:36

  2. #2
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Domyślnie

    mallocowi podajesz rozmiar pamięci w bajtach.
    Jeśli chcesz zaalokować tablice newem to w nawiasach kwadratowych podajesz ilość elementów. new dodatkowo wywołuje konstruktory, jeśli dana klasa posiada konstruktor domyślny.
    Kod:
    double complex *WORK = new double complex[LWORK];
    double complex *RWORK = new double complex[2*N];
    malloc działa również w C++.
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  3. #3
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Wielkie dzieki za wyjasnienie.

    Mam jeszcze jeden problem z wyswietlaniem wartosci.

    W C posiadam taki zapis:
    Kod:
     for(i=0;i<N;i++)
      printf("\n (%f, %f) \t",  eigenValues[i] );
    W ten sposob otrzymuje nastepujacy wynik:
    Kod:
    (-0.340723, 0.764017) 	
     (5.340723, 0.235983)
    I probuje to zamienic na zapis w C++:
    Kod:
     for(i=0;i<N;i++)
      cout<<"("<<eigenValues[i]<<","<<eigenValues[i]<<")"<<endl;
    i otrzymuje:
    Kod:
    (1,1)
    (1,1)
    eigenValues[N] jest typu double complex

    Wiem, ze printf dziala rowniez w C++, ale chcialabym otrzymac ten sam zapis w c++. Niestety nie wiem jak to zrobic.
    Ostatnio edytowane przez Gosik : 05-26-2013 - 15:13

  4. #4
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Domyślnie

    Spróbuj
    Kod:
    cout << '(' << creal(eigenValues[i]) << ", " << cimag(eigenValues[i]) << ')' << endl;
    Przy printfie, żeby było poprawniej, też powinnaś użyć creal() i cimag(). Obecnie masz tam hacka korzystającego z tego, że double complex to w pamięci dwa double. (Ale to tylko taki szczegół )

    Jeszcze gwoli ścisłości: Wbudowane typy complex to feature języka C99, natomiast w standardzie C++ tego nie ma (niektóre kompilatory, np. gcc, udostępniają funkcjonalności C99 w C++). Jeśli bardzo chcesz używać tylko rzeczy z C++, to powinnaś użyć szablonu std::complex<> z nagłówka <complex> (bez .h), który nawet współpracuje ze strumieniami Chociaż mogą być problemy ze współpracą z bibliotekami nie napisanymi dla C++ (co prawda std::complex<double> też najprawdopodobniej będzie dwoma doubleami w pamięci, to jednak niezalecane jest jeżdżenie obiektom po pamięci ).
    Ostatnio edytowane przez Rolek : 05-26-2013 - 17:40
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  5. #5
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Dziekuje badzo za wyjasnienie tego zagadnienia.

  6. #6
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Hej!
    Pojawil mi sie jeszcze jeden problem z biblioteka complex.

    Rozdzielilam moj program na czesci,

    tzn. mam plik main.cpp,
    kolejno storzylam plik wypisz.cpp:
    Kod:
    #include<iostream>
    #include<complex>
    using namespace std;
    
    void wypisz(complex<double> *dane, int &wiersze)
    {
            for (int i=0; i<wiersze; i++)
                    for (int j=0; j<wiersze; j++){
                       cout<<"t["<<i<<"]["<<j<<"]="<<dane[i * wiersze + j]<<endl;
                    }
    }
    oraz plik wypisz.h:
    Kod:
    #include<complex>
    #ifndef data_h_
    #define data_h_
    
    void wypisz(complex<double> *dane, int &wiersze);
    
    #endif
    Po kompilacji otrzymuje nastepujace bledy:
    Kod:
    ./wczytaj.h:8:6: error: variable has incomplete type 'void'
    void wypisz2(complex<double> *dane, int &wiersze);
         ^
    ./wczytaj.h:8:14: error: use of undeclared identifier 'complex'
    void wypisz2(complex<double> *dane, int &wiersze);
                 ^
    ./wczytaj.h:8:28: error: expected '(' for function-style cast or type construction
    void wypisz2(complex<double> *dane, int &wiersze);
                         ~~~~~~^
    ./wczytaj.h:8:31: error: use of undeclared identifier 'dane'
    void wypisz2(complex<double> *dane, int &wiersze);
    Do pliku wypisz.h zalaczylam biblioteke complex sadzac, ze nie zostaje rozpoznany typ danych.
    Ale niestety bledy nadal sie pojawiaja. Czy moglabym prosic o wyjasnienie dlaczego tak sie dzieje?

  7. #7
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Lightbulb

    std::complex<double>*
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  8. #8
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Wielkie dzieki!
    Tak myslalam, ze jest to blahostka

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj