2011-11-27 12 views
5

Esiste una classe per il supporto Matrix in Objective-C? Per Matrix intendo array 2D.Matrici in Objective-C

Quello che faccio ora è utilizzare 2 NSArray s, uno dentro l'altro. Funziona perfettamente ma il mio codice sembra un gran casino.

ho anche cercato di utilizzare le matrici in stile C all'interno di ogni-altro (matrix[][]), ma questo approccio non va bene per la mia domanda come io non posso automaticamente @synthesize o specificare @properties per loro.

Potrei ovviamente creare la mia classe per quello, ma quello che mi chiedo è se Objective-C ha già qualcosa per questo tipo di situazioni. Ho fatto qualche ricerca su Google ma non ho trovato nulla.

risposta

4

No, Foundation non ha alcuna classe di array 2D. Per quanto riguarda i calcoli matematici, le matrici sono tipicamente implementate in C o C++ per motivi di portabilità e prestazioni. Dovrai scrivere la tua classe per questo se lo vuoi davvero.

-2

Penso che sarà necessario sottoclasse NSArray o utilizzare una sintassi non dolce: [MyArray objectAtIndex:i*d+j]. Quest'ultimo caso è davvero complicato in quanto si otterrà un solo tipo di enumeratore goffo.

+3

Si dovrebbe solo sottoclasse 'NSArray' quando si può fornire il proprio storage. –

1

Sembra che obj-c non abbia una propria struttura per matrice. I riferiti alla CATransform3D di iOS SDK, ha rilevato che esso uso:

struct CATransform3D 
{ 
    CGFloat m11, m12, m13, m14; 
    CGFloat m21, m22, m23, m24; 
    CGFloat m31, m32, m33, m34; 
    CGFloat m41, m42, m43, m44; 
}; 

typedef struct CATransform3D CATransform3D; 

come Trasformazione 3D matrix.

+0

Il mio obiettivo era accedervi usando le coordinate, diciamo x e y. Grazie comunque per la risposta. – Dimme

1

In ritardo per la festa, ma vorrei citare this project, che implementa una classe Matrix flessibile basata su un array C, con interfacce a molte funzioni BLAS e LAPACK. Disclaimer: Sono lo sviluppatore.

uso di base è la seguente:

YCMatrix *I = [YCMatrix identityOfRows:3 Columns:3]; 
double v = [I getValueAtRow:1 Column:1]; 
[I setValue:0 Row:0 Column:0];