在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(数据)的逆。我该怎么做才能解决这个问题?
如果是因为我使用了ILArray而不是ILInArray和ILOutArray,那么如何使用这个矩阵呢?
发布于 2014-05-08 08:58:35
如何使用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用于求解线性方程组。矩阵的反演是求解这类方程组最昂贵的方法。通常情况下,这样昂贵的手术是可以避免的。为你做这件事。它首先尝试用更廉价的方法来求解方程组,然后再回到矩阵反演。
如果您确定需要完全反转,只需提供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 https://stackoverflow.com/questions/23532427
复制相似问题