创建一个函数处理函数处理的总和
6视图(30天)
显示旧的评论
Goodmorning每个人,
我有以下几点
点= [0.0194358127458200 0.0125146090698240 0.0120324235527160 0.00761174198214000 0.00660775699279100 0.00381485098617300 0.00195617023840500 0.000824508358196000 0.00121681256884900 0.000390389885216000 0.000444315057222000 0;
0 0.000452782917043000 0.000395689955442000 0.00121172812659200 0.000829869449880000 0.00195546440425700 0.00381482017361200 0.00661064156533300 0.00762496776011900 0.0120411026638820 0.0125098828784870 0.0189137987850580);
我需要创建一个函数处理如下。
我知道周长的中心接近更好的这些点是R的函数,和在点(R, R)。然后近似误差:
错误= @ (R) abs(规范([R-POINTS(我),R-POINTS(我)])- R));
这对于每一个点。
我想创建这个函数处理,是所有的错误的总和:
1)totdist = @ (R) error1 + error2 + error3 +…
我可以手动创建一个函数函数总结每一个错误:
2)totdist = @ (R) abs(规范([R-POINTS (1, 1), R-POINTS (2, 1))) - R)) + abs(规范([R-POINTS (1、2), R-POINTS (2, 2))) - R)) + abs(规范([R-POINTS (1,3), R-POINTS (2、3)]) - R)) +…
然而当点的数量大,我想手动创建求和函数1)authomatically没有总结2)的100倍。
函数必须使用“fminsearch”之后。
有办法实现吗?
提前感谢你的答案。
答案(3)
Bjorn Gustavsson
2023年1月13日
您的规范对我有点模糊,但是如果我解释它,这样你想适应这样一个函数:
(我使用的附加条件
和
,但是这个很容易放松)。你可以做一个通用的解决方案是这样的:
f_x = @ (R,θ,f_theta) R + f_theta (R,θ)。* cos(θ);
f_y = @ (R,θ,f_theta) R + f_theta (R,θ)。*罪(θ);
err_fcn = @ (R, X, Y, f_theta)和((X-f_x (R,量化(Y R, X R), f_theta))。^ 2 + (Y-f_y (R,量化(y R, x R), f_theta)) ^ 2);
f_theta = @ R (R,θ)*的(大小(θ));
休息= fminsearch (@ (R) err_fcn (R,点(1:),点(2:),f_theta), 20 e - 3);
这是一个相当麻烦的方式做出简单circle-fitting-function,您将发现多个circle-fitting-functions文件交换:
circle-fitting FEx贡献
。如果你的周长是更复杂,更复杂的比一个椭圆,然后你只需要修改
f_theta
相应地function-handle。如果圆周的中心不是一模一样的半径例如然后你必须修改上述代码片段:
f_x = @ (R,θ,f_theta) R (1) + f_theta (R(3),θ)。* cos(θ);
f_y = @ R (R,θ,f_theta) (2) + f_theta (R(3),θ)。*罪(θ);
err_fcn = @ (R, X, Y, f_theta)和((X-f_x (R,量化(Y R (2), X R (1)), f_theta))。^ 2 + (Y-f_y (R,量化(y R (2), x R (1)), f_theta)) ^ 2);
f_theta = @ R (R,θ)*的(大小(θ));
Rest3 = fminsearch (@ (R) err_fcn (R,点(1:),点(2:),f_theta), 20 e - 3 * (1 1 1));
您还可以允许额外的参数以适应,例如主要和次要的半径和角度轴的椭圆。但是,这开始成为匿名函数处理,而凌乱的代码在这个阶段,这里我倾向于过渡到适当的matlab函数文件,只是为了保持干净的代码。
HTH
2的评论
Bjorn Gustavsson
2023年1月13日
编辑:Bjorn Gustavsson
2023年1月13日
这就是我的第一个例子。对于一般circle-fitting函数遵循良好的链接文件交换的贡献,更一般的情况下解决这个问题。
HTH
里卡多。玛丽
2023年1月13日
1评论
马特·J
2023年1月13日
编辑:马特·J
2023年1月13日
这是一个糟糕的解决方案。非常缓慢,效率低下。我希望你们重新考虑其他建议。
点=兰德(100000);R = 0;
抽搐;
N =长度(点);
f =细胞(N, 1);
为i = 1: N
f{我}= @ (R) abs(规范([R-POINTS(我),R-POINTS(我)])- R);
结束
夏天totdist = @ (R) (f, R);
version1 = totdist (R);%计算
toc;
抽搐
errorFcn = @ (R)规范(vecnorm (POINTS-R) - R, 1);
version2 = errorFcn (R);%计算
toc
version1, version2%相同的结果