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
- iOS开发中矩阵的操作(乘积、求逆和转置)
- SGU196_Matrix Multiplication(求矩阵与其转置矩阵乘积后各元素的和)
- 求两个矩阵的乘积
- 求一个矩阵中连续四个数字(行,列,正、反对角线)乘积的最大值。
- 编程求两个矩阵的乘积(C++)
- 关于矩阵的一些操作(求转置矩阵、行列式、矩阵的秩、矩阵的逆矩阵、两个矩阵的乘积矩阵)
- 关于矩阵的一些操作(求转置矩阵、行列式、矩阵的秩、矩阵的逆矩阵、两个矩阵的乘积矩阵)
- C++ 求任意两个矩阵的乘积
- 算法 分治法求矩阵的乘积
- 求矩阵的转置矩阵和两个矩阵相乘
- 本程序主要实现了一个方阵的求逆与实现了逆矩阵和原矩阵的乘积为单位矩阵
- Java实现的矩阵类及矩阵的转置,加减乘和矩阵求逆
- 增量矩阵与其转置矩阵的乘积_baidu_2016_09_13-3
- 增量矩阵与其转置矩阵的乘积_baidu_20160913-3
- hust校赛 1615 Matrix 矩阵和其逆矩阵的乘积中不为0的元素个数
- 数据结构--数组和广义表--以行逻辑链接的顺序表为存储结构的矩阵的基本运算(求矩阵乘积)
- 邻接矩阵A和A的转置矩阵乘积表示的意义(有向图)
- 如何用Matlab求矩阵的秩、乘积、逆、行列式的值、转置
- [笔记]常用SQL语句
- C#线程(一)
- Bzoj 3209 花神的数论题
- Java四种引用类型
- PyCharm显示行号(四)
- iOS开发中矩阵的操作(乘积、求逆和转置)
- ny 找球号(一)
- EventEmitter 使用
- Android studio下NDK开发环境配置及开发流程
- 计算机语言发展史
- 链表分割问题
- 背景颜色转为UIImage
- performSelector系列方法编译器警告-Warc-performSelector-leaks
- AFNetworking解析(三)