如何使用ILMath.invert功能?(How to use ILMath.invert func

2019-10-20 02:12发布

在ILNumerics,我想反转矩阵A的结果是矩阵B.这里是我的代码:

        ILArray<double> data = ILSpecialData.sinc(50, 50);
        ILArray<double> data2 = ILMath.zeros(50, 50);
        ILMath.invert(data, data2);

其方法是:

ILMath.invert Method (ILInArray<Double>, ILOutArray<Double>)

public static void invert(
       ILInArray<double> A,
       ILOutArray<double> outArray
)

但我得到的,而不是矩阵A(数据)的反转在矩阵B(DATA2)的零矩阵。 我应该怎么做才能解决这个问题?

如果因为我有使用ILArray代替ILInArray和ILOutArray,如何使用这个矩阵?

Answer 1:

如何使用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 

如果你想叫它directy(不推荐),你可以去这样的:

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的逆矩阵,你可以乘AB ,应该得到一个单位矩阵:

> 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 


文章来源: How to use ILMath.invert function?