我偶然发现了一些我觉得非常奇怪的事情。
作为示例考虑代码
A = reshape(1:6, 3,2)
A/[1 1]
给出了
3×1 Array{Float64,2}:
2.5
3.5
4.5
据我所知,一般来说,这种除法给出了列的加权平均值,其中每个权重与向量的相应元素成反比。
所以我的问题是,为什么这样定义?
这个定义的数学证明是什么?
答案 0 :(得分:6)
这是|A - v*[1 1]|₂
的最小误差解决方案 - 过度约束,一般没有确切的解决方案(即值v
,使得范数精确为零)。 /
和\
的行为严重超载,通过各种技术和启发式方法解决欠系统和过度约束系统。这种重载是否是一个好主意是值得商榷的,但这是人们对Matlab和Octave中的这些操作所期望的,并且在单个运算符中提供如此多的功能通常非常方便。
答案 1 :(得分:6)
让A
为NxN
矩阵,b
为Nx1
列向量。然后\
解决了Ax=b
,/
解决了xA=b
。
正如Stefan所提到的,这被扩展到欠定的案例作为最小二乘解决方案。这是通过QR或SVD分解完成的。请参阅这些算法的详细信息,了解为何会出现这种情况。提示:OLS估计器的线性形式实际上可以写成矩阵分解的解决方案,所以它是一样的。
现在您可能会问,它是如何解决的?这是一个复杂的问题。基本上,它使用矩阵分解。但是使用哪种矩阵分解依赖于矩阵类型。其原因是因为高斯消除是O(n ^ 3),因此通常不好处理问题。但无论什么时候你可以专攻,你都可以获得加速。所以基本上\
(和/
,转置和调用\
)检查一堆特殊类型并选择分解或其他算法(LU,QR,SVD,Cholesky等)。 )基于矩阵类型。 The flow chart from MATLAB很好地解释了这一点。这里有很多细节,当矩阵稀疏时它会获得更多细节。另外还应提及IterativeSolvers.jl,因为它是解决Ax=b
的另一组算法。
大多数应用数学问题都归结为线性代数,求解Ax=b
是最重要和最困难的问题之一,这就是为什么有大量关于这个问题的研究。事实上,你可以说绝大多数数值线性代数领域都致力于寻找在特定矩阵类型上求解Ax=b
的快速方法。 \
基本上将所有直接(非迭代)方法放入一个方便的运算符中。