【问题标题】:How to use ILMath.invert function?如何使用 ILMath.invert 函数?
【发布时间】:2014-06-25 07:03:06
【问题描述】:

在 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
)

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

如果是因为我使用了 ILArray 而不是 ILInArray 和 ILOutArray,如何使用这个矩阵?

【问题讨论】:

  • 存在从 ILArrayILInArrayILOutArray 的隐式转换(如果没有,您会看到编译器错误)
  • @Damien_The_Unbeliever 该代码没有错误甚至警告。

标签: c# arrays matrix ilnumerics invert


【解决方案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 

如果你想直接调用它(不推荐),你可以这样:

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 

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2019-03-27
    • 2021-12-02
    • 2021-11-22
    • 2018-01-04
    • 2019-09-21
    • 2011-11-14
    相关资源
    最近更新 更多