Julia中矩阵向量除法运算符的定义

4

我发现了一些我认为非常奇怪的事情。

以代码为例:

A = reshape(1:6, 3,2)
A/[1 1]

这提供了

3×1 Array{Float64,2}:
 2.5
 3.5
 4.5

据我所知,通常这种划分会给出列的加权平均值,其中每个权重与向量的相应元素成反比。

因此我的问题是,为什么要这样定义?

这个定义的数学依据是什么?

2个回答

7

这是最小误差解决方案,用于求解 |A - v*[1 1]|₂。由于过约束,在一般情况下(即使使用值v使范数精确为零),没有精确解。 /\ 的行为被重载,通过各种技术和启发式方法解决欠约束和过约束系统。这种重载的好处有待商榷,但在Matlab和Octave中,人们已经习惯了这些操作,而且在单个运算符中拥有如此多的功能通常非常方便。


2
看到 pinv([1 1]) ≈ [.5, .5]A*pinv([1 1]) ≈ [2.5, 3.5, 4.5] 可能也有所帮助。 - mbauman
虽然如此,这不是基本上在说同样的事情吗?尽管如此,以不同的方式解释肯定是有帮助的。 - StefanKarpinski
1
是的,表面上它是一个循环论证。不过,对于一些人来说可能是有用的,因为它有效地将\\运算符的黑盒子向上推了一个级别,而不是完全深入线性代数中。简而言之:你想要乘以逆矩阵,但非方阵并不是完全可逆的(一个令人惊讶的易读数学维基部分!)。 - mbauman
我尝试将那段复制添加到答案中,但无法找到一种方法来添加它而不使答案更加混乱。pinv似乎是计算答案的一种手段,而不是定义正在计算什么的好方法。 - StefanKarpinski

6
A成为一个NxN矩阵,b成为一个Nx1列向量。然后\解决Ax=b/解决xA=b
正如Stefan所提到的那样,这可以扩展到欠定情况下的最小二乘解。这是通过QR或SVD分解完成的。请查看这些算法的详细信息以了解原因。提示:OLS估计器的线性形式实际上可以写成矩阵分解的解,因此它是相同的。
现在你可能会问,它是如何解决问题的?这是一个复杂的问题。基本上,它使用矩阵分解。但使用的矩阵分解取决于矩阵类型。这是因为高斯消元是O(n ^ 3),所以通常不适用于一般情况。但是,每当您可以专门处理时,就可以获得加速。因此,\(和转置并调用\/)检查一堆特殊类型,并选择基于矩阵类型的分解或其他算法(LU,QR,SVD,Cholesky等)。 MATLAB的流程图非常好地解释了这一点。这里有很多细节,当矩阵是稀疏的时候会变得更加详细。此外,还应该提到IterativeSolvers.jl,因为它是另一组解决Ax=b的算法。
大多数应用数学问题都可以归结为线性代数,其中解决Ax=b是最重要且最困难的问题之一,这就是为什么对该主题进行了大量研究的原因。事实上,您可能可以说,数值线性代数领域的绝大部分工作都致力于寻找特定矩阵类型上解决Ax=b的快速方法。 \基本上将所有直接(非迭代)方法放入一个方便的运算符中。

x == [2.5 3.5 4.5] 应该解决 xA=b,其中 b=[1,1],但是 x*A == [23.0,54.5]。我错在哪里了? - Dan Getz
哦,它是同时转置吗?是 xA'=b 吗? - Chris Rackauckas
不知道,使用 A' 大小不匹配。猜想我太懒了,没看关于 / 的说明 :/ - Dan Getz
好的,我已经去看了Matlab链接。混淆是因为A/b解决了x*b=A(而A\b解决了A*x=b)。实际上,[2.5,3.5,4.5]*[1 1]给出了对A的最小二乘逼近。谢谢。 - Dan Getz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接