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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.