使用矩阵,加速框架,iOS

时间:2012-08-14 17:34:47

标签: ios frameworks matrix

我有两个矩阵:A和B.

  1. 我如何存储它们?
  2. 如何使用Accelerate框架计算矩阵A的逆矩阵?
  3. 如何找到A * B的产品?
  4. 如何使用Accelerate框架转置矩阵A?
  5. 感谢您回答我的问题!

    帮助文件

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

    实施档案

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

    从主要功能

    调用我的代码
    #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;
    }
    

1 个答案:

答案 0 :(得分:8)

我仍然对使用加速框架有点新意,但我会尽我所能。

  1. 加速框架期望矩阵作为a传递 1D阵列。因此,如果您有一个4x4矩阵,则会放置第一行 在数组的索引0-3中,第二个rouw将放入 索引4-7等等。
  2. 我从来没有这样做,但这个答案看起来是一个很好的起点。 https://stackoverflow.com/a/11321499/385017
  3. 您要使用的方法是vDSP_mmul表示单精度,vDSP_mmulD表示双精度。您可能希望查看documentation以获得更好的使用方法,但这只是一个让您入门的示例。

    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.