我试图理解由Fitzgibbon,Pilu和Fisher(由Halir和Flusser改进)开发的直接最小二乘椭圆拟合算法中的归一化和"非标准化"步骤.
编辑:关于理论的更多细节补充.特征值问题是否源于混淆?
简短理论:
椭圆由隐式二阶多项式(一般圆锥方程)表示:
哪里:
要将此一般圆锥约束为椭圆,系数必须满足二次约束:
这相当于:
其中C是零的矩阵,除了:
设计矩阵D由所有数据点x sub i组成.
圆锥和数据点之间距离的最小化可以用广义特征值问题表示(某些理论已被省略):
表示:
我们现在有了这个系统:
如果我们求解该系统,则对应于单个正特征值的特征向量是正确答案.
代码:
这里的代码片段直接来自作者提供的MATLAB代码:http: //research.microsoft.com/en-us/um/people/awf/ellipse/fitellipse.html
数据输入是一系列(x,y)点.通过减去平均值并除以标准偏差来归一化这些点(在这种情况下,计算为范围的一半).我假设这种规范化允许更好地拟合数据.
% normalize data
% X and Y are the vectors of data points, not normalized
mx = mean(X);
my = mean(Y);
sx = (max(X)-min(X))/2;
sy = (max(Y)-min(Y))/2;
x = (X-mx)/sx;
y = (Y-my)/sy;
% Build design matrix
D = [ x.*x x.*y y.*y x y ones(size(x)) ];
% Build scatter matrix
S = D'*D; %'
% Build …Run Code Online (Sandbox Code Playgroud) 我正在使用 Python 使用 subprocess 模块调用 C++ 程序。由于程序需要一些时间来运行,我希望能够使用 Ctrl+C 来终止它。我在 StackOverflow 上看到了一些关于此的问题,但似乎没有一个解决方案对我有用。
我想要的是在 KeyboardInterrupt 上终止子进程。这是我拥有的代码(类似于其他问题中的建议):
import subprocess
binary_path = '/path/to/binary'
args = 'arguments' # arbitrary
call_str = '{} {}'.format(binary_path, args)
proc = subprocess.Popen(call_str)
try:
proc.wait()
except KeyboardInterrupt:
proc.terminate()
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行它,代码会挂起,等待进程结束并且永远不会注册 KeyboardInterrupt。我也尝试了以下方法:
import subprocess
import time
binary_path = '/path/to/binary'
args = 'arguments' # arbitrary
call_str = '{} {}'.format(binary_path, args)
proc = subprocess.Popen(call_str)
time.sleep(5)
proc.terminate()
Run Code Online (Sandbox Code Playgroud)
此代码片段在终止程序时工作正常,因此问题不是发送到终止的实际信号。
如何更改代码以便子进程可以在 KeyboardInterrupt 上终止?
我正在运行 Python 2.7 和 Windows 7 64 位。提前致谢!
我尝试过的一些相关问题: