原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc
为工程添加引入库文件Accelerate.framework
然后再要进行计算的swift文件中
import Accelerate
一、向量和常数运算
函数形式
vDSP_vs***D(vector, 1, &scalar, &result, 1, length_of_vector)
这里的1代表对所有向量元素进行操作,如果是2,则每隔一个进行操作。绝大部分情况是1。
具体实例1、向量和常数相加
var v = [4.0, 5.0]
var s = 3.0
var 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]
vDSP_vsmulD(v, 1, &s, &vsresult, 1, vDSP_Length(v.count))
vsresult // returns [12.0, 15.0]
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]
vDSP_vmulD(v1, 1, v2, 1, &vvresult, 1, vDSP_Length(v1.count))
vvresult // returns [3.0, 8.0]
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.0
vDSP_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
}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]