首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ILMath.invert函数?

如何使用ILMath.invert函数?
EN

Stack Overflow用户
提问于 2014-05-08 03:52:24
回答 1查看 405关注 0票数 1

在ILNumerics中,我想反演矩阵A,结果是矩阵B。下面是我的代码:

代码语言:javascript
复制
        ILArray<double> data = ILSpecialData.sinc(50, 50);
        ILArray<double> data2 = ILMath.zeros(50, 50);
        ILMath.invert(data, data2);

方法是:

代码语言:javascript
复制
ILMath.invert Method (ILInArray<Double>, ILOutArray<Double>)

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-08 08:58:35

如何使用ILMath.invert

ILMath.invert不是反转矩阵,而是一个数组的元素!如果需要反演矩阵,请参见下面的解决方案。这是你问题的字面答案。假设,我们有一个矩阵A

代码语言:javascript
复制
ILArray<double> A = ILMath.counter(2,3); 
> A
>  <Double> [2,3]
> [0]:          1          3          5 
> [1]:          2          4          6 

内部使用invert函数来实现像-A这样的表达式,即A元素的反转:

代码语言:javascript
复制
> -A     
> <Double> [2,3]
> [0]:         -1         -3         -5 
> [1]:         -2         -4         -6 

如果您想将其称为直接(不推荐),您可以这样做:

代码语言:javascript
复制
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用于求解线性方程组。矩阵的反演是求解这类方程组最昂贵的方法。通常情况下,这样昂贵的手术是可以避免的。为你做这件事。它首先尝试用更廉价的方法来求解方程组,然后再回到矩阵反演。

如果您确定需要完全反转,只需提供ILMath.eye()作为ILMath.linsolve的第二个参数:

代码语言:javascript
复制
ILArray<double> A = ILMath.rand(5,5);
ILArray<double> B = ILMath.linsolve(A, ILMath.eye(5, 5));

为了使B真的是A的逆,你可以把AB相乘,得到一个恒等矩阵:

代码语言:javascript
复制
> 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 

注意,由于舍入错误,一些元素与零略有不同。但是,错误很小:

代码语言:javascript
复制
> ILMath.norm(C - ILMath.eye(5,5))
> <Double> (:,:) 1e-016 * 
> 5,3541 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23532427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档