2012-08-14 10 views
7

Ho due matrici: A e B.Lavorare con le matrici, accelerare quadro, iOS

  1. Come posso salvarli?
  2. Come si può calcolare la matrice inversa della matrice A utilizzando il framework Accelerate?
  3. Come trovare il prodotto di A * B?
  4. Come è possibile trasporre la matrice A utilizzando il framework Accelerate?

Grazie per aver risposto alle mie domande!

file di Helper

#import <Foundation/Foundation.h> 
#include <Accelerate/Accelerate.h> 

@interface Working_with_matrices : NSObject 
-(int)invert_matrix:(int) N andWithMatrix:(double*) matrix; 
@end 

file di implementazione

#import "Working_with_matrices.h" 
#include <Accelerate/Accelerate.h> 

@implementation Working_with_matrices 
-(int) matrix_invert:(int) N andWithMatrix:(double*)matrix 
{  
int error=0; 
int *pivot = malloc(N*N*sizeof(int)); 
double *workspace = malloc(N*sizeof(double)); 

dgetrf_(&N, &N, matrix, &N, pivot, &error); 

if (error != 0) { 
    NSLog(@"Error 1"); 
    return error; 
} 

dgetri_(&N, matrix, &N, pivot, workspace, &N, &error); 

if (error != 0) { 
    NSLog(@"Error 2"); 
    return error; 
} 

free(pivot); 
free(workspace); 
return error; 
} 

Chiama il mio codice funzione principale

#import <Foundation/Foundation.h> 
#import "Working_with_matrices.h" 

int main(int argc, const char * argv[]) 
{ 
int N = 3; 
double A[9]; 
Working_with_matrices* wm=[[Working_with_matrices alloc]init]; 

A[0] = 1; A[1] = 1; A[2] = 7; 
A[3] = 1; A[4] = 2; A[5] = 1; 
A[6] = 1; A[7] = 1; A[8] = 3; 
[wm invert_matrix:N andWithMatrix:A]; 
//  [ -1.25 -1.0 3.25 ] 
// A^-1 = [ 0.5 1.0 -1.5 ] 
//  [ 0.25 0.0 -0.25 ] 
for (int i=0; i<9; i++) 
{ 
    NSLog(@"%f", A[i]); 
} 
return 0; 
} 

risposta

8

Sono ancora un pò di nuovo da utilizzando il framework accelerare, ma io rispondi a ciò che posso

  1. Il framework accelerato prevede che le matrici vengano passate come un array 1D . Quindi, se si dispone di una matrice 4x4, la prima riga verrà posizionata negli indici 0-3 dell'array, la seconda sarà posizionata negli indici 4-7 e così via.
  2. Non l'ho mai fatto ma questa risposta sembra un buon punto di partenza. https://stackoverflow.com/a/11321499/385017
  3. Il metodo che si desidera utilizzare è vDSP_mmul per la precisione singola o vDSP_mmulD per la precisione doppia. Si potrebbe voler guardare il documentation per ottenere una migliore non comprensione su come usarlo, ma è un esempio per iniziare.

    float *matrixA; //set by you 
    float *matrixB; //set by you 
    float *matrixAB; //the matrix that the answer will be stored in 
    
    vDSP_mmul(matrixA, 1, matrixB, 1, matrixAB, 1, 4, 4, 4); 
    // the 1s should be left alone in most situations 
    // The 4s in order are: 
    //  the number of rows in matrix A 
    //  the number of columns in matrix B 
    //  the number of columns in matrix A and the number of rows in matrix B. 
    
+0

Grazie per la vostra replica! Mi piacerebbe sapere che questa libreria funziona nel progetto iOS? E se lo fa, come posso includere questa libreria nel mio progetto Xcode? –

+1

Sì, il framework accelerate è disponibile per iOS. Puoi aggiungerlo seguendo queste istruzioni. http://stackoverflow.com/a/3377682/385017 –

+0

Perfetto! Ho compilato questo esempio (http://stackoverflow.com/questions/11282746/how-to-perform-matrix-inverse-operation-using-the-accelerate-framework/11321499#11321499). Ma, quando ho scritto il wrapper di classe per queste funzioni, non ho potuto compilare il mio progetto a causa del messaggio di errore "a eccezione non rilevata 'NSInvalidArgumentException', motivo: '- [Working_with_matrices invert_matrix: andWithMatrix:]: selettore non riconosciuto inviato all'istanza 0x10750dd90' ". Sareste così gentili da spiegare come posso risolvere questo errore? Grazie! –