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

C++ macierz

Ostatnio zmodyfikowano 2016-03-19 12:33
Autor Wiadomość
mateczek
» 2016-03-18 20:27:35
moim zdaniem nie ma sensu pisać transpozycji, bez macierzy pomocniczej, dla macierzy innych niż kwadratowe!!!

1. nie działa przy tablicach dynamicznych (wiersze trzeba poszerzać)

2 można odwrotnie macierz wyświetlić :) ale transponować -  na siłę się da !!!

C/C++
#include <iostream>
using namespace std;

int main() {
    int macierz[ 3 ][ 5 ] = { { 1, 2, 3, 4, 5 },
        { 1, 2, 3, 4, 5 },
        { 1, 2, 3, 4, 5 } };
   
   
    for( int kolumny = 0; kolumny < 5; kolumny++ ) {
        for( int wiersze = 0; wiersze < 3; wiersze++ ) {
            cout << macierz[ wiersze ][ kolumny ] << " ";
        }
        cout << endl;
    }
   
}

}
P-146167
AdamDy
» 2016-03-18 20:42:56
Cóż to za problem wypisać na odwrót :P
Po co ma działać dla dynamicznych skoro wiemy ze nie potrzebujemy az takich duzych macierzy. Zawsze można zwiększyć zakres.
A zastosowanie zawsze sie znajdzie, powiedzmy ze mamy jakis obrazek i latwiej by nam sie na nim pracowalo po ztransponowaniu ;D
P-146168
jolkaaa3
Temat założony przez niniejszego użytkownika
» 2016-03-18 21:17:19
AdamDy bardzo dziękuję, Twój program działa super. Ja jednak nie znam się tak dobrze na programowaniu i chciałam zapytać czy wersja bez dodawania tej biblioteki też jest możliwa?
P-146171
AdamDy
» 2016-03-18 23:26:07
tak możesz zrobić nową funkcje:
ja po prostu zrobilem to dla wygody sorka, to jest po prostu funkcja zwracajaca minimum z liczb, mozesz zrobic tak:
C/C++
int min( int a, int b ) {
    if( a < b ) {
        return a;
    }
    else {
        return b;
    }
}
P-146178
mateczek
» 2016-03-19 12:12:21

Cóż to za problem wypisać na odwrót!!

no chyba o to chodzi, że żaden a rozwiązanie dość proste nie wymagające przerzucania danych!

Podeślę jeszcze jedno proste rozwiązanie polegające na zastąpieniu macierzy podwójnej pojedyńczą !!! (transponowanie macierzy nie wymaga zmiany rozmiaru) dlatego macierz pojedyncza nada się do takich operacji.
C/C++
#include <iostream>
using namespace std;
class matrix {
   
    int * data;
    bool transp_org = false;
    int liczbaWierszy, liczbaKolumn;
public:
    int wiersze() {
        return liczbaWierszy;
    }
    int kolumny() {
        return liczbaKolumn;
    }
    matrix( int wiersze, int kolumny ) {
        liczbaWierszy = wiersze;
        liczbaKolumn = kolumny;
        data = new int[ liczbaWierszy * liczbaKolumn ];
        for( int i = 0; i < liczbaWierszy * liczbaKolumn; i++ )
             data[ i ] = i; //wypełniamy macierz przy tworzeniu
       
    }
    ~matrix() {
        delete[] data;
    }
   
    int & operator ()( int wiersz, int kolumna ) {
        int index;
        if( !transp_org ) index = wiersz * liczbaKolumn + kolumna; // liczenie indexu dla macierzy orginalnej
        else
             index = wiersz + kolumna * liczbaWierszy; // liczenie indexu dla macierzy transponowanej
       
        return data[ index ];
    }
    void transpozycja() {
        transp_org = !transp_org; // przełacznik oryginal/transpozycja
        int temp = liczbaWierszy;
        liczbaWierszy = liczbaKolumn; // wiersze kolumny - zamiamy liczbę wierszy z liczbą kolumn
        liczbaKolumn = temp;
    }
   
};

int main() {
    matrix m( 2, 3 );
   
    for( int w = 0; w < m.wiersze(); w++ ) {
        for( int k = 0; k < m.kolumny(); k++ ) {
            cout << m( w, k ) << " ";
        }
        cout << endl;
    }
    cout << endl;
    m.transpozycja();
    for( int w = 0; w < m.wiersze(); w++ ) {
        for( int k = 0; k < m.kolumny(); k++ ) {
            cout << m( w, k ) << " ";
        }
        cout << endl;
    }
   
   
}


transpozycja w tym przypadku to tylko zmiana sposobu liczenia indexu
C/C++
void transpozycja() {
    transp_org = !transp_org;
    int temp = liczbaWierszy;
    liczbaWierszy = liczbaKolumn;
    liczbaKolumn = temp;
}
//orginalnie liczymy tak:
index = wiersz * liczbaKolumn + kolumna;

//po transpozycji tak:

index = wiersz + kolumna * liczbaWierszy;
//macierz i dane są nietknięte nie trzeba nic przekładać to takie odwrotne wyświetlanie
wyjście programu

0 1 2
3 4 5

0 3
1 4
2 5
Naciśnij <RETURN> aby zamknąć to okno...
od dawna kusiłem się z zamiarem klepnięcia jakieś prostej klasy dla tablic 2D :) wątek mi się przydał :P
P-146191
jankowalski25
» 2016-03-19 12:24:02
Można użyć gotowych bibliotek, na przykład gpstk zaproponowanej w temacie [C++] Biblioteka gpstk dołączenie i użycie w C::B.

Przykład:
C/C++
#include <Matrix.hpp>
#include <iostream>

int main()
{
    gpstk::Matrix < int > matrix( 4, 5 );
    for( int i = 0; i < 4; i++ )
    {
        for( int j = 0; j < 5; j++ )
        {
            matrix[ i ][ j ] =( i * 5 ) + j;
        }
    }
    std::cout.width( 2 );
    std::cout << matrix << '\n';
   
    gpstk::Matrix < int > matrixT = gpstk::transpose( matrix );
    std::cout << matrixT << '\n';
}
Standardowe wyjście programu:

  0  1  2  3  4
  5  6  7  8  9
 10 11 12 13 14
 15 16 17 18 19
 0 5 10 15
 1 6 11 16
 2 7 12 17
 3 8 13 18
 4 9 14 19
P-146194
mateczek
» 2016-03-19 12:33:01
Można użyć gotowych bibliotek, na przykład gpstk
 kiedyś szukałem jakiejś macierzy coby dynamiczne rezerwować pamięć za jednym zamachem dla całego 2D. I tak jest zawsze jak człowiek już coś klepnie okazuje się że było zawsze . Idę na piwo  :P
P-146195
1 « 2 »
Poprzednia strona Strona 2 z 2