如何使用ILMath.invert
ILMath.invert 不反转矩阵,而是反转数组的元素!如果您需要反转矩阵,请参阅下面的解决方案。这是您问题的字面答案。假设,我们有一个矩阵A:
ILArray<double> A = ILMath.counter(2,3);
> A
> <Double> [2,3]
> [0]: 1 3 5
> [1]: 2 4 6
invert函数内部用于实现-A这样的表达式,即A的元素取反:
> -A
> <Double> [2,3]
> [0]: -1 -3 -5
> [1]: -2 -4 -6
如果你想直接调用它(不推荐),你可以这样:
ILArray<double> data = ILSpecialData.sinc(3, 3);
ILArray<double> data2 = 0; // just some initialization
ILMath.invert(data,data2); // invert elements of data, return in data2
> data
> <Double> [3,3]
> [0]: (:,:) 1e-002 *
> [1]: 5,7765 5,0334 5,0334
> [2]: 5,0334 6,0334 6,0334
> [3]: 5,0334 6,0334 6,0334
>
> data2
> <Double> [3,3]
> [0]: (:,:) 1e-002 *
> [1]: -5,7765 -5,0334 -5,0334
> [2]: -5,0334 -6,0334 -6,0334
> [3]: -5,0334 -6,0334 -6,0334
解决方案:如何反转矩阵
对于
我想反转一个矩阵A
您需要改用ILMath.linsolve()。 Linsolve 用于求解线性方程组。矩阵求逆是求解此类方程组最昂贵的方法。通常可以避免这种昂贵的操作。 Linsolve 为您做到这一点。它首先尝试使用更便宜的选项来求解方程组,然后再返回矩阵求逆。
如果您确定需要完全反转,只需提供ILMath.eye() 作为ILMath.linsolve 的第二个参数:
ILArray<double> A = ILMath.rand(5,5);
ILArray<double> B = ILMath.linsolve(A, ILMath.eye(5, 5));
为了证明 B 确实是 A 的倒数,你可以将 A 和 B 相乘,应该得到一个单位矩阵:
> ILMath.multiply(A, B)
> <Double> [5,5]
> [0]: 1 0,0000 0,0000 0,0000 0
> [1]: 0,0000 1,0000 0,0000 0,0000 0,0000
> [2]: 0,0000 0,0000 1,0000 0,0000 0,0000
> [3]: 0,0000 0,0000 0,0000 1 0
> [4]: 0,0000 0,0000 0,0000 0 1,0000
请注意,由于舍入误差,某些元素与零略有不同。虽然错误很小:
> ILMath.norm(C - ILMath.eye(5,5))
> <Double> (:,:) 1e-016 *
> 5,3541