標籤:ios 矩陣 向量 matrix vector
為工程添加引入庫檔案Accelerate.framework
然後再要進行計算的swift檔案中
import Accelerate
一、向量和常數運算
函數形式
vDSP_vs***D(vector, 1, &scalar, &result, 1, length_of_vector)
這裡的1代表對所有向量元素進行操作,如果是2,則每隔一個進行操作。絕大部分情況是1。
具體執行個體
1、向量和常數相加
<pre name="code" class="plain">var v = [4.0, 5.0]var s = 3.0var vsresult= [Double](count : v.count, repeatedValue : 0.0)vDSP_vsaddD(v, 1, &s, &vsresult, 1, vDSP_Length(v.count))vsresult // returns [7.0, 8.0]
2、向量和常數相乘
vDSP_vsmulD(v, 1, &s, &vsresult, 1, vDSP_Length(v.count))vsresult // returns [12.0, 15.0]
3、向量和常數相除
vDSP_vsdivD(v, 1, &s, &vsresult, 1, vDSP_Length(v.count))vsresult // returns [1.333333333333333, 1.666666666666667]
二、向量和向量之間運算
vDSP_v***D(vector_1, 1, vector_2, 1, &result, 1, length_of_vector)
這裡的1和一中的一樣,代表對每一個元素進行操作
1、向量對應相加
var v1 = [1.0, 2.0]var v2 = [3.0, 4.0]var vvresult = [Double](count : 2, repeatedValue : 0.0)vDSP_vaddD(v1, 1, v2, 1, &vvresult, 1, vDSP_Length(v1.count))vvresult // returns [4.0, 6.0]
2、向量對應相乘
vDSP_vmulD(v1, 1, v2, 1, &vvresult, 1, vDSP_Length(v1.count))vvresult // returns [3.0, 8.0]
3、向量對應相除
vDSP_vdivD(v1, 1, v2, 1, &vvresult, 1, vDSP_Length(v1.count))vvresult // returns [3.0, 2.0]
4、向量點乘
var v3 = [1.0, 2.0]var v4 = [3.0, 4.0]var dpresult = 0.0vDSP_dotprD(v3, 1, v4, 1, &dpresult, vDSP_Length(v3.count))dpresult // returns 11.0
三、矩陣運算
由於這個庫對矩陣的操作採用一維數組,所以加減操作和向量一樣
1、矩陣乘法
vDSP_mmulD(matrix_1, 1, matrix_2, 1, &result, 1, rows_of_matrix_1, columns_of_matrix_2, columns_of_matrix_1_or_rows_of_matrix_2)
注意:由於兩個矩陣相乘,前一個矩陣的列數必須等於後一個矩陣的行數,所以給出一個就行了。
var m1 = [ 3.0, 2.0, 4.0, 5.0, 6.0, 7.0 ]var m2 = [ 10.0, 20.0, 30.0, 30.0, 40.0, 50.0]var mresult = [Double](count : 9, repeatedValue : 0.0)vDSP_mmulD(m1, 1, m2, 1, &mresult, 1, 3, 3, 2)mresult // returns [90.0, 140.0, 190.0, 280.0, 370.0, 270.0, 400.0, 530.0]
2、求逆矩陣
func invert(matrix : [Double]) -> [Double] { var inMatrix = matrix var pivot : __CLPK_integer = 0 var workspace = 0.0 var error : __CLPK_integer = 0 var N = __CLPK_integer(sqrt(Double(matrix.count))) dgetrf_(&N, &N, &inMatrix, &N, &pivot, &error) if error != 0 { return inMatrix } dgetri_(&N, &inMatrix, &N, &pivot, &workspace, &N, &error) return inMatrix}<pre name="code" class="plain">var m = [1.0, 2.0, 3.0, 4.0]invert(m) // returns [-2.0, 1.0, 1.5, -0.5]
3、矩陣轉置
vDSP_mtransD(matrix, 1, &result, 1, number_of_rows_of_result, number_of_columns_of_result)
舉例
var t = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]var mtresult = [Double](count : 6, repeatedValue : 0.0)vDSP_mtransD(t, 1, &mtresult, 1, 3, 2)mtresult // returns [1.0, 4.0, 2.0, 5.0, 3.0, 6.0]
IOS中的矩陣和向量運算