iOS开发中矩阵的操作(乘积、求逆和转置)

来源:互联网 发布:物联网农业数据平台 编辑:程序博客网 时间:2024/06/05 18:15

iOS开发中矩阵的操作(乘积、求逆和转置)


蓝牙开发中牵扯到很多关于矩阵方面的算法,之前也找了不少资料,各个语言都有关于矩阵计算的算法,其中swift语言中的算法比较简洁,但是经测试却有问题,具体各个算法网上随便搜都有,参考地址http://blog.sina.com.cn/s/blog_6d01cce30102vfdj.html,包括了向量的运算以及矩阵的构建、相乘,求逆和转置,具体说下这个矩阵求逆,代码如下:

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]

经过测试,当传入的数组元素个数大于8个的时候程序会崩溃,崩溃的原因也找了很长时间,可惜能力有限swift函数集合太深,有知道原因的多谢留言。这里提供另外两种矩阵求逆的方法:
1.仿照c语言或者你会的任何一种其他的语言的矩阵求逆算法,按照oc或者swift语法也出一份,这是根据数学上矩阵求逆的标准算法计算的,c语言参考地址:http://blog.sina.com.cn/s/blog_62450b980100f5ny.html
2.swix重点介绍这个库,下载地址:http://www.oschina.net/p/swix.非常全能的库文件,提供了很多点数的计算方法,可以实现绘图,折线图,流量图等。矩阵求逆在其目录下的m-matrix.swift,实现方法在m-complex-math.swift:

func inv(x: matrix) -> matrix{    assert(x.shape.0 == x.shape.1, "To take an inverse of a matrix, the matrix must be square. If you want the inverse of a rectangular matrix, use psuedoinverse.")    let y = x.copy()    let (M, N) = x.shape    var ipiv:Array<__CLPK_integer> = Array(count:M*M, repeatedValue:0)    var lwork:__CLPK_integer = __CLPK_integer(N*N)//    var work:[CDouble] = [CDouble](count:lwork, repeatedValue:0)    var work = [CDouble](count: Int(lwork), repeatedValue: 0.0)    var info:__CLPK_integer=0    var nc = __CLPK_integer(N)    dgetrf_(&nc, &nc, !y, &nc, &ipiv, &info)    dgetri_(&nc, !y, &nc, &ipiv, &work, &lwork, &info)    return y}

使用时可以直接构建matrix对象,然后获得属性I就可,由于在oc或者swift中二维数组并不像其它语言那么方便,而且传递参数构建矩阵的时候一般传的也是一维数组,所以矩阵求逆后如果也想返回一维数组的话,可以resultMatrix.I.flat.grid:

       var resultMatrix = matrix(columns: columns,rows: rows)       return resultMatrix.I.flat.grid;

补充

如果是采用oc编写的程序话,请使用混编。再导入swix时会有一个问题,里面会有一个swix-Bridging-Header.h的桥文件,可以将这个文件内容复制粘贴到自己的桥文件中,然后把这个文件删掉即可,一些对应的引用位置也将名字替换一下即可。如果oc和swift混编有疑问,可以参考:http://blog.csdn.net/weasleyqi/article/details/50583423

1 0