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

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

你可能感兴趣的:(ios,算法,ios开发)