Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于加速框架的Swift矩阵求逆_Ios_Xcode_Swift_Linear Algebra_Matrix Inverse - Fatal编程技术网

Ios 基于加速框架的Swift矩阵求逆

Ios 基于加速框架的Swift矩阵求逆,ios,xcode,swift,linear-algebra,matrix-inverse,Ios,Xcode,Swift,Linear Algebra,Matrix Inverse,按照我在这里找到的很好的说明:我验证了矩阵求逆是有效的。事实上,对于所给出的例子,它确实如此。 但是,对于任何其他矩阵(大于2x2),我都会得到一个EXC\u BAD\u ACCESS错误。例如,以下2D矩阵(转换为1D数组)已在matlab和python中成功测试,但不起作用 m = [0.55481645013013, -1.15522603580724, 0.962090414322894, -0.530226035807236, 0.168545207161447, -0.3862712

按照我在这里找到的很好的说明:我验证了矩阵求逆是有效的。事实上,对于所给出的例子,它确实如此。 但是,对于任何其他矩阵(大于2x2),我都会得到一个
EXC\u BAD\u ACCESS
错误。例如,以下2D矩阵(转换为1D数组)已在matlab和python中成功测试,但不起作用

m = [0.55481645013013, -1.15522603580724, 0.962090414322894, -0.530226035807236, 0.168545207161447, -0.38627124296868, 0.93401699437494, -0.999999999999995, 0.684016994374945, -0.23176274578121, 0.123606797749979, -0.323606797749979, 0.432893622827287, -0.323606797749979, 0.123606797749979, 0.231762745781211, -0.684016994374948, 1.0, -0.934016994374947, 0.386271242968684, 0.168545207161448, -0.530226035807237, 0.962090414322895, -1.15522603580724, 0.554816450130132]
其逆矩阵应为

inv(AA)

ans =

  Columns 1 through 3

          -262796763616197          -656991909040516          4.90007819375216
          -162417332048282          -406043330120712          14.6405748712708
         0.718958226823704          7.87760147961979          30.4010295628018
           162417332048287           406043330120730          46.1614842543337
           262796763616208           656991909040536          55.9019809318537

  Columns 4 through 5

          -656991909040528           262796763616211
          -406043330120721           162417332048287
         -4.28281034550088        -0.718958226823794
           406043330120704          -162417332048283
           656991909040497          -262796763616196
你能给我另一种用Swift进行矩阵求逆的方法吗?或者给我解释一下如何解决这个问题?
我真的不明白它为什么不起作用。

它不起作用,因为你发现的说明不太好。具体来说,枢轴和工作空间都需要是数组,而不是标量值;它只是在随机情况下对二乘二的矩阵起作用

下面是
invert
函数的修改版本,它可以正确分配工作空间:

func invert(matrix : [Double]) -> [Double] {
  var inMatrix = matrix
  var N = __CLPK_integer(sqrt(Double(matrix.count)))
  var pivots = [__CLPK_integer](count: Int(N), repeatedValue: 0)
  var workspace = [Double](count: Int(N), repeatedValue: 0.0)
  var error : __CLPK_integer = 0
  dgetrf_(&N, &N, &inMatrix, &N, &pivots, &error)
  dgetri_(&N, &inMatrix, &N, &pivots, &workspace, &N, &error)
  return inMatrix
}
我还应该注意到,你的5x5矩阵是病态的,所以即使你可以计算“逆”,计算的误差也会很大,而且真的不应该使用逆矩阵

ASwift 4版本:

func invert(matrix : [Double]) -> [Double] {
    var inMatrix = matrix
    var N = __CLPK_integer(sqrt(Double(matrix.count)))
    var pivots = [__CLPK_integer](repeating: 0, count: Int(N))
    var workspace = [Double](repeating: 0.0, count: Int(N))
    var error : __CLPK_integer = 0

    withUnsafeMutablePointer(to: &N) {
        dgetrf_($0, $0, &inMatrix, $0, &pivots, &error)
        dgetri_($0, &inMatrix, $0, &pivots, &workspace, $0, &error)
    }
    return inMatrix
}

我用Swift写了一个线性代数库。我将此库称为swix,它包含用于反转矩阵的函数(此函数称为
inv

示例用例:

var b = ones(10)
var A = rand((10, 10))
var AI = inv(A)
var x = AI.dot(b)
资料来源:


文档:

Genius!非常感谢你!我的矩阵是病态的,因为它是小5x5。我将进行其他测试,但我需要使用至少21x21矩阵进行计算。Xcode 9无法同时访问var'N',但修改需要独占访问;考虑复制到本地变量< /代码>。这是一个Xcode 9错误还是我们应该写东西differently@Guig:这是的结果,尽管它是否打算应用于C风格的不安全指针API(如LAPACK)并不明显。您只需复制几份
N
,就可以解决这个问题。谢谢您的链接。
&N
中的任何一个都不应该被
dgetrf_u
dgetri_u
修改,对吗?@StephenCanon:我已经冒昧添加了一个swift4版本,希望你不介意。我在哪里可以得到这个库?哦,天哪,我添加了源代码和文档Genius的链接!用于比较Swift和Matlab/Python的链接在github上不起作用,您可以修复吗?我将很快尝试您的库用于我的目的您的示例项目工作得很好,但是不可能将您的库包含在一个全新的项目中!你的指示不完整!另一个用户也有同样的问题,我已经通过github更新了。这些都是轻微的修改;今年夏天,我将为Swift软件包经理进行调整