2012-08-14 11 views
7

Tôi có hai ma trận: A và B.Làm việc với ma trận, đẩy mạnh khuôn khổ, iOS

  1. Làm thế nào tôi có thể lưu trữ chúng?
  2. Làm cách nào tôi có thể tính toán ma trận nghịch đảo của ma trận A bằng cách sử dụng khung tăng tốc?
  3. Làm cách nào để tìm sản phẩm của A * B?
  4. Tôi có thể chuyển ma trận A bằng cách sử dụng khung tăng tốc như thế nào?

Cảm ơn bạn đã trả lời câu hỏi của mình!

tập tin Helper

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

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

tập tin thực hiện

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

Gọi mã của tôi từ chức năng chính

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

Trả lời

8

Tôi vẫn kinda mới để sử dụng tăng tốc khuôn khổ nhưng tôi sẽ trả lời những gì tôi có thể.

  1. Khuôn khổ tăng tốc mong đợi ma trận được chuyển thành một mảng 1D. Vì vậy, nếu bạn có ma trận 4x4, hàng đầu tiên sẽ được đặt trong chỉ mục 0-3 của mảng của bạn, rouw thứ hai sẽ được đặt trong các chỉ số 4-7 và cứ tiếp tục như vậy.
  2. Tôi chưa bao giờ làm điều đó nhưng câu trả lời này trông giống như một điểm khởi đầu tốt. https://stackoverflow.com/a/11321499/385017
  3. Phương pháp bạn sẽ muốn sử dụng là vDSP_mmul cho độ chính xác đơn hoặc vDSP_mmulD cho độ chính xác gấp đôi. Bạn có thể muốn xem số documentation để hiểu rõ hơn về cách sử dụng nó, nhưng đó là một ví dụ để bạn bắt đầu.

    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

Cảm ơn bạn đã phát lại! Tôi muốn biết doest thư viện này làm việc trong dự án iOS? Và nếu có, làm thế nào tôi có thể đưa thư viện này vào dự án Xcode của tôi? –

+1

Có, khung tăng tốc khả dụng cho iOS. Bạn có thể thêm nó bằng cách làm theo các hướng dẫn này. http://stackoverflow.com/a/3377682/385017 –

+0

Thật hoàn hảo! Tôi đã biên soạn ví dụ này (http://stackoverflow.com/questions/11282746/how-to-perform-matrix-inverse-operation-using-the-accelerate-framework/11321499#11321499). Tuy nhiên, khi tôi viết trình bao bọc lớp cho các hàm này, tôi không thể biên dịch dự án của mình do thông báo lỗi "để vô tình loại trừ" NSInvalidArgumentException ', lý do:' - [Working_with_matrices invert_matrix: andWithMatrix:]: selector không nhận dạng được gửi tới instance 0x10750dd90 ' ". Bạn sẽ rất tốt để giải thích làm thế nào tôi có thể sửa lỗi này? Cảm ơn bạn! –