PDA

View Full Version : [C++] Un array di matrici[4x4] come si fa?


DomusP45
18-01-2014, 17:42
Salve a tutti.

Ho una serie di valori memorizzati in una serie di array di double [4][4], in pratica sono matrici 4x4.

Mi servirebbe poterle assegnare ad un array, così da poter richiamare (ad esempio) la matrice 2 facendo array[2] nella funzione.

Questa cosa è possibile? Cosa mi consigliate?

pabloski
18-01-2014, 18:01
Non vedo il problema. C++ supporta gli array multidimensionali, tipo


double array[2][4][4];

DomusP45
18-01-2014, 18:05
Non vedo il problema. C++ supporta gli array multidimensionali, tipo


double array[2][4][4];


non è un problema, volevo la conferma di questa cosa. Grazie.

vendettaaaaa
18-01-2014, 18:16
Salve a tutti.

Ho una serie di valori memorizzati in una serie di array di double [4][4], in pratica sono matrici 4x4.

Mi servirebbe poterle assegnare ad un array, così da poter richiamare (ad esempio) la matrice 2 facendo array[2] nella funzione.

Questa cosa è possibile? Cosa mi consigliate?
#include <array>
#include <vector>

int main()
{
using Array4 = std::array<double, 4>; // se non compila, scrivi typedef std::array<double, 4> Array4;
using Matrix4x4 = std::array<Array4, 4>;

Array4 vettore1 = { 1., 2., 3., 4. };
Array4 vettore2 = { 5., 6., 7., 8. };
Array4 vettore3 = { 9., 8., 7., 6. };
Array4 vettore4 = { 5., 4., 3., 2. };

Matrix4x4 matrice = { vettore1, vettore2, vettore3, vettore4 };

std::vector<Matrix4x4> arrayDiMatrici;
}

DomusP45
18-01-2014, 18:27
#include <array>
#include <vector>

int main()
{
using Array4 = std::array<double, 4>; // se non compila, scrivi typedef std::array<double, 4> Array4;
using Matrix4x4 = std::array<Array4, 4>;

Array4 vettore1 = { 1., 2., 3., 4. };
Array4 vettore2 = { 5., 6., 7., 8. };
Array4 vettore3 = { 9., 8., 7., 6. };
Array4 vettore4 = { 5., 4., 3., 2. };

Matrix4x4 matrice = { vettore1, vettore2, vettore3, vettore4 };

std::vector<Matrix4x4> arrayDiMatrici;
}


infatti, il metodo diretto non funziona, o perlomeno mi caccia un errore (troppi inizializzatori)...come si dichiara un vettore multidimensionale (intendo come ci assegno i contenuti)?

Considerando che sono 9 matrici 4x4, il metodo migliore qual'è?

double [9][4][4] oppure con vector e array?

vendettaaaaa
18-01-2014, 18:31
infatti, il metodo diretto non funziona, o perlomeno mi caccia un errore (troppi inizializzatori)...come si dichiara un vettore multidimensionale (intendo come ci assegno i contenuti)?

Considerando che sono 9 matrici 4x4, il metodo migliore qual'è?

double [9][4][4] oppure con vector e array?
Il metodo migliore è sempre usare vector e array perchè sono oggetti intelligenti. Con un double[9][4][4] rischi di sbagliare alla grande con gli indici...

Ad ogni modo il mio codice ha dentro qualche feature del C++11; se non hai compilatori adatti (Visual Studio 2013 o GCC 4.7+) puoi inizializzare gli Array4 così:
Array4 vettore1; vettore1[0] = 1.; vettore1[1] = 2.; // eccetera, o usando un ciclo for o in tanti altri modi
E analogamente
Matrix4x4 matrice; matrice[0] = vettore1; // eccetera

std::array è per lo più come std::vector, ma non ridimensionabile.

DomusP45
18-01-2014, 18:34
Il metodo migliore è sempre usare vector e array perchè sono oggetti intelligenti. Con un double[9][4][4] rischi di sbagliare alla grande con gli indici...

Ad ogni modo il mio codice ha dentro qualche feature del C++11; se non hai compilatori adatti (Visual Studio 2013 o GCC 4.7+) puoi inizializzare gli Array4 così:
Array4 vettore1; vettore1[0] = 1.; vettore1[1] = 2.; // eccetera, o usando un ciclo for o in tanti altri modi
E analogamente
Matrix4x4 matrice; matrice[0] = vettore1; // eccetera

std::array è per lo più come std::vector, ma non ridimensionabile.

io sto usando visual c++ 2010, posso usare questa sintassi?

vendettaaaaa
18-01-2014, 19:14
io sto usando visual c++ 2010, posso usare questa sintassi?
Scusa ma non puoi provare prima di scrivere un post? Certo che puoi...

DomusP45
19-01-2014, 10:50
ho provato un'altra cosa, sempre con <vector>

L'ho dichiarato così

vector<double[4][4]> arrayoftc;

che è un pò quello che mi servirebbe a me, un array di double4x4. Però non va.

Considerando che sono 9 matrici, messe in 9 array double[4][4], io l'assegnazione l'avevo fatta così

arrayoftc.push_back(T1);
arrayoftc.push_back(T2);
arrayoftc.push_back(T3);
arrayoftc.push_back(T4);
arrayoftc.push_back(T5);
arrayoftc.push_back(T6);
arrayoftc.push_back(T7);
arrayoftc.push_back(T8);
arrayoftc.push_back(T9);

dove T1, T9 sono le 9 matrici 4x4 (double)

ma mi da errore.

Non ho ben capito come fare la cosa del "matrix4x4" e assegnargli i vettori...a me sono le matrici sono così salvate:

double T8[4][4] = {
{-1, 0.2, -0.2, 0.1},
{0.1, -0.3, -0.9, 0.15},
{-0.5, -0.80, 0.25, 0.89},
{0, 0, 0, 1.0 }};

e vorrei appunto assegnare ognuna di queste ad una posizione del "vector" come faccio?

Grazie in anticipo a tutti per la disponibilità.

DomusP45
07-02-2014, 09:12
up...nessuno mi sa aiutare?

Alla fine quello che mi servirebbe è implementare "una coda" di array 4x4, che vado a riempire man mano...facendo push da un lato, e pop dall'altro quando mi servono le matrici double [4][4]...

Qualcuno mi sa aiutare?

Daniels118
07-02-2014, 12:37
EDIT: mamma mia, rileggendo quello che ho scritto mi vergogno, mi esprimo meglio:
Crea una classe per rappresentare la tua matrice 4x4, poi crei una coda dove andrai ad inserire gli elementi della matrice le matrici.
Per le code vedi qui:
http://www.cplusplus.com/reference/queue/queue/

DomusP45
07-02-2014, 14:52
uCrea una classe per rappresentare la tua matrice, poi crei una coda dove andrai ad inserire gli elementi della matrice.
Per le code vedi qui:
http://www.cplusplus.com/reference/queue/queue/

Grazie dell'idea!

DomusP45
12-02-2014, 17:28
Ho cambiato il mio codice con questo:

//per l'array delle TC

typedef array<array<double,4>,4> Matrix;


Matrix T1 = {{
{{-1.0000, 0.0000, -0.0000, 0.1531}},
{{0.0000, 0.0000, -1.0000, 0.1502 }},
{{-0.0000, -1.0000, -0.0000, 1.0790}},
{{0 , 0, 0, 1.0000 }}}};

Matrix T2 = {{
{{-1.0000, 0.0009, 0.0019, 0.1500}},
{{-0.0021, -0.4464, -0.8948, 0.1845}},
{{0.0000, -0.8948, 0.4464, 0.8094 }},
{{ 0, 0, 0, 1.0000 }}}};

etc...

poi le metto nell'array vector così

vector <Matrix> TCS;

TCS.push_back(T1);
TCS.push_back(T2);
TCS.push_back(T3);
TCS.push_back(T4);
TCS.push_back(...)

e così via.

Ora, mi serve accedere alla singola TC da un'altra funzione, che vuole la matrice nel formato di partenza, cioè double[4][4]...come faccio per ottenere la singola TC?

Avevo provato con

double m[4][4] = TCS.pop_back;


ma non va bene...a me andrebbe bene fare il pop man mano, però devo mettere la matrice "popped" in un array temporaneo che sia double[4][4] così da poterlo utilizzare con le classiche chiamate m[i][j] e lavorarci...

sapete aiutarmi su quest'ultima cosa?

DomusP45
13-02-2014, 09:15
up