7

I have two matrices: A and B.

  1. How can I store them?
  2. How can I calculate the inverse matrix of matrix A using the Accelerate framework?
  3. How can find the product of A*B?
  4. How can I transpose matrix A using the Accelerate framework?

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

1 に答える 1

8

私はまだ加速フレームワークの使用に慣れていませんが、できる限り答えます。

  1. 加速フレームワークは、行列が 1D 配列として渡されることを想定しています。したがって、4x4 行列がある場合、最初の行は配列のインデックス 0 ~ 3 に配置され、2 番目の行はインデックス 4 ~ 7 に配置されます。
  2. 私はそれをやったことがありませんが、この答えは良い出発点のようです。https://stackoverflow.com/a/11321499/385017
  3. 使用するメソッドはvDSP_mmul、単精度またはvDSP_mmulD倍精度です。使用方法をよりよく理解するには、ドキュメントを参照することをお勧めしますが、開始するための例を次に示します。

    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.
    
于 2012-08-14T18:07:46.343 に答える