在程式中,很常使用矩陣(Matrix)或是向量(Vector)來做運算,以解決許多數學上的難題,如果你有這方面的需求,不妨參考使用 Accelerate Framework 來加速運算的過程。Accelerate Framework 從 iOS 3.2 開始,就陸陸續續包含許多原生 C 語言的 Library,例如 BLAS、vDSP 和 vecLib 等等,你可以透過這些指令直接與底層的晶片進行溝通進而加速運算的過程,只是礙於晶片上位元的限制,這些指令可能無法單從字面上就看出它的功能。
使用方式
若要使用 Accelerate Framework 必須以手動的方式替專案新增 Accelerate.framework,並且引用對應的標頭檔。
以手動的方式替專案新增 Framework |
#import <Accelerate/Accelerate.h>
對於新增 Framework 有問題的讀者們,請參考 Xcode 4 新增 Framework 的方法一文。
程式範例
使用 BLAS 函式庫求矩陣與向量的乘積
//矩陣與向量的乘積
float matrix[3][2] = {
{5.0f, 1.0f},
{1.0f, 5.0f},
{5.0f, 1.0f}
};
float vector[2] = {1.0f, 2.0f};
float ans[3] = {0.f, 0.f, 0.f};
cblas_sgemv(CblasRowMajor, CblasNoTrans, 3, 2, 1.0f, (float*)matrix, 2, (float*)vector, 1, 1.0f, ans, 1);
NSLog(@"ans = [%f, %f, %f]", ans[0], ans[1], ans[2]);
上述程式碼中,由於陣列與向量的行列並不相符,如果直接做數學上的運算將無法得解,關於這一點可以透過 CblasRowMajor 或是 CblasColMajor 參數來做調整,就不需要更動矩陣或是向量的資料格式。
執行結果 |
使用 BLAS 函式庫求聯立方程式的解
//解聯立
//2x + 5y = 24
//3x + 4y = 36
int colA = 2, rowA = 2;
double *A = (double*)malloc(colA*rowA*sizeof(double));
A[0] = 2; A[2] = 5;
A[1] = 3; A[3] = 4;
int colB = 1, rowB = 2;
double *B = (double*)malloc(colB*rowB*sizeof(double));
B[0] = 24; B[1] = 36;
// N = number of columns of A.
// NRHS = number of columns of B.
// LDA = number of rows of A.
// IPIV = pivot indices.
// LDB = number of rows of B.
int N = colA,
NRHS = colB,
LDA = rowA,
IPIV[2],
LDB = rowB,
INFO;
dgesv_(&N, &NRHS, A, &LDA, IPIV, B, &LDB, &INFO);
NSLog(@"X = %f, Y = %f", B[0], B[1]);
在上述程式碼,我們將方程式的系數放置於矩陣 A 中,並且將方程式的解放置於向量 B 內,請注意矩陣 A 中的資料順序,相同參數的系數應該要放在一起才能做計算,最後運算結果會覆寫於 B 向量之中。
執行結果 |
ps:若要求解聯立方程式的唯一解,有多少未知參數,就會有多少組的聯立方程式,因此矩陣 A 的行列必須相等才有可能求解。聯立方程式的解可由矩陣 A 的反矩陣與向量 B 的乘積求得。
其他
由於 Accelerate Framework 所涵蓋的指令庫相當龐大,在此無法逐一介紹,關於其他指令與它們的使用方式,請參考 iOS Developer Library,裡面有更詳細的說明。
沒有留言:
張貼留言