【发布时间】:2017-10-05 03:33:01
【问题描述】:
我希望将一种算法从 MATLAB 移植到 Python。所述算法的一个步骤涉及采用A^(-1/2),其中 A 是一个 9x9 方形复矩阵。据我了解,矩阵的平方根(以及它们的逆矩阵)不是唯一的。
我一直在尝试使用 scipy.linalg.fractional_matrix_power 和使用 A^(-1/2) = exp((-1/2)*log(A)) 与 numpy 内置的 expm 和 logm 函数的近似值。前者特别差,只提供小数点后 3 位的精度,而后者对于左上角的元素来说是正确的,但随着您向下和向右移动,它会变得越来越差。这可能是也可能不是表达式的完全有效的数学解决方案,但对于此应用程序来说还不够。
因此,我希望在 Python 中直接实现 MATLAB 的矩阵幂算法,以便每次都能 100% 确认相同的结果。有没有人对这将如何工作有任何见解或文档?该算法的并行性越高越好,因为最终目标是在 OpenCL 中重写它以实现 GPU 加速。
编辑:按要求提供 MCVE:
[[(0.591557294607941+4.33680868994202e-19j), (-0.219707725574605-0.35810724986609j), (-0.121305654177909+0.244558388829046j), (0.155552026648172-0.0180264818714123j), (-0.0537690384136066-0.0630740244116577j), (-0.0107526931263697+0.0397896274845627j), (0.0182892503609312-0.00653264433724856j), (-0.00710188853532244-0.0050445035279044j), (-2.20414002823034e-05+0.00373184532662288j)], [(-0.219707725574605+0.35810724986609j), (0.312038814492119+2.16840434497101e-19j), (-0.109433401402399-0.174379997015402j), (-0.0503362231078033+0.108510948023091j), (0.0631826956936223-0.00992931123813742j), (-0.0219902325360141-0.0233215237172002j), (-0.00314837555001163+0.0148621558916679j), (0.00630295247506065-0.00266790359447072j), (-0.00249343102520442-0.00156160619280611j)], [(-0.121305654177909-0.244558388829046j), (-0.109433401402399+0.174379997015402j), (0.136649392858215-1.76182853028894e-19j), (-0.0434623984527311-0.0669251299161109j), (-0.0168737559719828+0.0393768358149159j), (0.0211288536117387-0.00417146769324491j), (-0.00734306979471257-0.00712443264825166j), (-0.000742681625102133+0.00455752452374196j), (0.00179068247786595-0.000862706240042082j)], [(0.155552026648172+0.0180264818714123j), (-0.0503362231078033-0.108510948023091j), (-0.0434623984527311+0.0669251299161109j), (0.0467980890488569+5.14996031930615e-19j), (-0.0140208255975664-0.0209483313237692j), (-0.00472995448413803+0.0117916398375124j), (0.00589653974090387-0.00134198920550751j), (-0.00202109265416585-0.00184021636458858j), (-0.000150793859056431+0.00116822322464066j)], [(-0.0537690384136066+0.0630740244116577j), (0.0631826956936223+0.00992931123813742j), (-0.0168737559719828-0.0393768358149159j), (-0.0140208255975664+0.0209483313237692j), (0.0136137125669776-2.03287907341032e-20j), (-0.00387854073283377-0.0056769786724813j), (-0.0011741038702424+0.00306007798625676j), (0.00144000687517355-0.000355251914809693j), (-0.000481433965262789-0.00042129815655098j)], [(-0.0107526931263697-0.0397896274845627j), (-0.0219902325360141+0.0233215237172002j), (0.0211288536117387+0.00417146769324491j), (-0.00472995448413803-0.0117916398375124j), (-0.00387854073283377+0.0056769786724813j), (0.00347771689075251+8.21621958836671e-20j), (-0.000944046302699304-0.00136521328407881j), (-0.00026318475762475+0.000704212317211994j), (0.00031422288569727-8.10033316327328e-05j)], [(0.0182892503609312+0.00653264433724856j), (-0.00314837555001163-0.0148621558916679j), (-0.00734306979471257+0.00712443264825166j), (0.00589653974090387+0.00134198920550751j), (-0.0011741038702424-0.00306007798625676j), (-0.000944046302699304+0.00136521328407881j), (0.000792908166233942-7.41153828847513e-21j), (-0.00020531962049495-0.000294952695922854j), (-5.36226164765808e-05+0.000145645628243286j)], [(-0.00710188853532244+0.00504450352790439j), (0.00630295247506065+0.00266790359447072j), (-0.000742681625102133-0.00455752452374196j), (-0.00202109265416585+0.00184021636458858j), (0.00144000687517355+0.000355251914809693j), (-0.00026318475762475-0.000704212317211994j), (-0.00020531962049495+0.000294952695922854j), (0.000162971629601464-5.39321759384574e-22j), (-4.03304806590714e-05-5.77159110863666e-05j)], [(-2.20414002823034e-05-0.00373184532662288j), (-0.00249343102520442+0.00156160619280611j), (0.00179068247786595+0.000862706240042082j), (-0.000150793859056431-0.00116822322464066j), (-0.000481433965262789+0.00042129815655098j), (0.00031422288569727+8.10033316327328e-05j), (-5.36226164765808e-05-0.000145645628243286j), (-4.03304806590714e-05+5.77159110863666e-05j), (3.04302590501313e-05-4.10281583826302e-22j)]]
【问题讨论】:
-
“精确到小数点后三位”是什么意思?您的问题是 matlab 和 numpy 结果之间的区别吗?只要两个矩阵都产生
B^2==A,它们都是有效的结果。您的应用程序不应该依赖任何唯一性(如果没有唯一性),或者提供额外的约束以使答案唯一。 -
正如我将运行
scipy.linalg.fractional_matrix_power(A,(-1/2))并获得一些类似 (-8.50000000e+01 - 1.65625000e+02j) 的元素,并且没有理由让第一个答案正好是 85。问题在应用程序中,该算法得到迭代,以便稍后的结果收敛。我已经对我的 python 端口进行了超过 1000 次迭代的测试,在某些情况下它们仍然存在 10% 左右的错误。 -
Here 是一个很好的评论。
标签: python matlab scipy matrix-multiplication