IOS中的矩阵和向量运算

为工程添加引入库文件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.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]


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.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
}<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]


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。