说明

我们现已知道可以用 simd 求解线性方程组,可是 simd 最多只支撑 4×4,当需求进行更大规模的方程组求解时(比方 AutoLayout 的布局核算)就会需求求解更大的方程组,矩阵的初等变换规矩当然仍是用 LAPACK 来求解了,究竟苹果自家的Accelerate框架中自带了相关函数。

用法

用 LAPAgitlabCK 解方程组,可以运用sgesv_() -> Int宫颈癌疫苗32函数,开始的s代表着单精度,即Float类型,假设需求运用双精度Double类型,也可以运用dgesv_() -> Int32函数。

和 SVD 相似,我们还需求运用苹果封装好的类Matrixsgesv_(swiftly)函数的另一个强壮之处,在于可以一同求多组作用。用几许的方法描绘便是:已知转换矩阵的情况下,可以一同求出多个点,在转换前的坐标。用代数方法描绘:如下,当系数矩阵相一同swift结算系统,可以一同求出多组(x, y, z)对应的解。

[1021−1−1120]∗[xgithub永久回家地址yz]=[123]left[ begin{公积金借款matrix} 1 &swift代码 0 & 2 1 & -1 & -1 1 & 2 & 0 end{mat工商银行rix} right] * left[ begin{matr矩阵的乘法运算ix} x y z engithub中文社区d{matrix} right] = left[ begin{matrix} 1 2 3github直播渠道永久回家 end{matrix} right]
[1021−1−1120]∗[xyz]=[321]left[ begigithub永久回家地址n{matrix} 1 & 0 & 2 1 & -1 & -1 1 & 2 & 0 end{matrix} right] * left[ begin{matrix} x y z end{matrix} right] = left[ begin{matrix} 3 2 1 en矩阵的迹d{GitHubmatrix} right]
extension Matrix {
/// 方程组求解,a为系数矩阵,b 为作用(可多组),返回值实践存储在 b 中
public static func sv(a:Matrix,b:Matrix) -> Matrixswift代码是什么意思 {
//info = 0, 程序正常运转结束。
v工商银行ar info = Int32(0)
//矩阵的size,系数矩阵公积金借款应该是方阵,一个5x5的矩阵,则n=5;
var n = a.n
//rhs的列数,LAPACgithub直播渠道永久回家K可以一同对一个系数矩阵,多个rhs进行求解,因为枸杞对系数矩阵只宫颈癌需求进行一次LU分化,多个rhs一同求解更便利;
var nrhs = Int32(b.n)
//leading di矩阵游戏mension of a,lda>=max(1,n);
var lda = n
//leading dimension of b, ldb>=max(1,n)
var ldb = n
//pivot的行交流记载,第i行被交流到第ipiv[i]行;
var ipiv = A矩阵rray(repeating: Igithub开放私库nt32(0),github永久回家地址 count: Int(n))
//求解后的作用存储在 b 中
sgesv_(&n公积金, &nrhs, a.data.baseAddress, &lda, &ipiv, b.data.baseAddress, &ldb, &a工商银行mp;info)
if info < 0 {
fatalErr公积金or("`s矩阵的迹gesv_` info = (in宫外孕fo)")
} else if info > 0 {
fatalError("algorithmDidNotConverge")
}
return b
}
}

代码

运用方法如下:

let nums:[Float] = [1,1,1矩阵天王,0,-1,2,2,-1,公积金借款0]
let m = Matrix(source: nums, rowCount: 3, colugithub永久回家地址mnCount: 3)
let r = Matrix(source: [1,2,3,3,2,1], rowCount:宫外孕 3,github columnCount: 2)
let x = Matrix.sv(a: m, b: r)
print(x)
/*
2.00 2.00
0.50 -矩阵的乘法运算0.50
-0.50 0.50
*/

项目代码

本系列文章代码已发布在 github:ComputationalGeometrySwift