Work with matrices, frame acceleration, iOS

I have two matrices: A and B.

  • How can I save them?
  • How can I calculate the inverse matrix of matrix A using the Accelerate framework?
  • How to find A * B product?
  • How to transfer matrix A using the Accelerate frame?

Thank you for answering my questions!

Helper file

#import <Foundation/Foundation.h> #include <Accelerate/Accelerate.h> @interface Working_with_matrices : NSObject -(int)invert_matrix:(int) N andWithMatrix:(double*) matrix; @end 

Implementation file

 #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; } 

Call my code from the main function

 #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; } 
+7
source share
1 answer

I'm still new to using the acceleration view, but I will answer that I can.

  • The acceleration view expects matrices to be transmitted as 1D. So, if you have a 4x4 matrix, the first row will be placed at indexes 0-3 of your array, the second road will be placed at indices 4-7, etc.
  • I have never done this, but this answer seems to be a good starting point. stack overflow
  • The method you want to use is vDSP_mmul for single precision or vDSP_mmulD for double precision. You might want to look at the documentation to get a better understanding of how to use it, but here is an example to get you started.

     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. 
+8
source

All Articles