我发现了一些我认为非常奇怪的事情。
以代码为例:
A = reshape(1:6, 3,2)
A/[1 1]
这提供了
3×1 Array{Float64,2}:
2.5
3.5
4.5
据我所知,通常这种划分会给出列的加权平均值,其中每个权重与向量的相应元素成反比。
因此我的问题是,为什么要这样定义?
这个定义的数学依据是什么?
这是最小误差解决方案,用于求解 |A - v*[1 1]|₂
。由于过约束,在一般情况下(即使使用值v
使范数精确为零),没有精确解。 /
和 \
的行为被重载,通过各种技术和启发式方法解决欠约束和过约束系统。这种重载的好处有待商榷,但在Matlab和Octave中,人们已经习惯了这些操作,而且在单个运算符中拥有如此多的功能通常非常方便。
A
成为一个NxN
矩阵,b
成为一个Nx1
列向量。然后\
解决Ax=b
,/
解决xA=b
。\
(和转置并调用\
的/
)检查一堆特殊类型,并选择基于矩阵类型的分解或其他算法(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 GetzxA'=b
吗? - Chris RackauckasA'
大小不匹配。猜想我太懒了,没看关于 /
的说明 :/ - Dan GetzA/b
解决了x*b=A
(而A\b
解决了A*x=b
)。实际上,[2.5,3.5,4.5]*[1 1]
给出了对A
的最小二乘逼近。谢谢。 - Dan Getz
pinv([1 1]) ≈ [.5, .5]
和A*pinv([1 1]) ≈ [2.5, 3.5, 4.5]
可能也有所帮助。 - mbauman\\
运算符的黑盒子向上推了一个级别,而不是完全深入线性代数中。简而言之:你想要乘以逆矩阵,但非方阵并不是完全可逆的(一个令人惊讶的易读数学维基部分!)。 - mbaumanpinv
似乎是计算答案的一种手段,而不是定义正在计算什么的好方法。 - StefanKarpinski