gpt4 book ai didi

matlab - 在不使用循环的情况下查找数据集中的奇数点

转载 作者:行者123 更新时间:2023-12-01 14:46:04 25 4
gpt4 key购买 nike

我得到一组点 (p1,q1) (p2,q2) ... (p20,q20) 满足函数 q = 1/(ap + b )^2 除了其中一个不满足给定的关系ab 的值没有给我。我只有两个输入 pq 作为数组。我需要找到不满足给定关系的点的索引。

我继续解决的方法是使用前两对 (p1,q1)ab 找到值(p2,q2) 并检查剩余的点是否满足 ab 的求解值的函数。结果将存储在逻辑矩阵中。 我想利用逻辑矩阵来找出奇数对,但无法进一步进行。

具体而言,挑战在于利用 MATLAB 中的矢量化来查找奇数点,而不是诉诸 for 循环。我认为我必须首先在任何行中搜索唯一的逻辑零。在那种情况下,那个零的列索引会给我带来奇数点。但是,如果所有 4 行中有一个以上的零,则奇数点是前两对中的任何一个。我需要帮助将其转换为 MATLAB 中的高效代码。

请注意,向量 pq 在下面的代码中被命名为 xy

function [res, sol] = findThePair(x, y)

N = length(x);

syms a b
vars = [a,b];
eqns = [y(1) - 1/(a*x(1) + b)^2 == 0; y(2) - 1/(a*x(2) + b)^2];
[solA, solB] = solve(eqns,vars);
sol = [double(solA) double(solB)]; %solution of a & b (total 4 possibilites)

xTest = x(3:end); % performing check on remaining points
yTest = y(3:end);
res = zeros(4, N-2); % logical matrix to store the results of equality check

for i = 1:4
A = sol(i,1); B = sol(i, 2);
res(i, :) = [yTest == 1./(A*xTest + B).^2]; % perform equality check on remaining points
end

最佳答案

让我们先做一些数学运算,以避免需要循环矢量化。至多这给我们留下了六个功能评估,我们只需要 5 个点。

q = 1 / (a*p + b)^2
% ->
sqrt(q) * ( a*p + b ) = 1
% ->
a = ( 1 - b*sqrt(q) ) / ( p * sqrt(q) )

% Sub in some points (1 and 2) ->
a1 = ( 1 - b*sqrt(q1) ) / ( p1 * sqrt(q1) )
a2 = ( 1 - b*sqrt(q2) ) / ( p2 * sqrt(q2) )
% a1 and a2 should be the same ->
( 1 - b*sqrt(q1) ) * ( p2 * sqrt(q2) ) = ( 1 - b*sqrt(q2) ) * ( p1 * sqrt(q1) )
% Rearrange ->
b = ( p2*sqrt(q2) - p1*sqrt(q1) ) / ( (p2-p1)*sqrt(q1)*sqrt(q2) )

我们有两个未知数,ab。我们只需要两个点来创建联立方程。我将使用以下逻辑

  1. 选择 (pm, qm)(pn, qn) 以及任何 m ~= n

  2. 使用上述等式计算ab

  3. 测试 (pr, qr) 是否符合计算出的 ab

    • 如果合适,我们知道所有这三个都必须在曲线上,并且我们有 ab

    • 如果不合适,我们知道点 mnr 是异常值。返回步骤 (1) 和另外两点,计算的 ab 必须正确,因为我们没有拟合异常值。

      <

下面是一些实现这个的代码:

% Random coeffs, keep things unknown
a = rand*10;
b = rand*10;
% Set up our data
p = 1:20;
q = 1 ./ (a*p + b).^2;
% Create an outlier
q( 3 ) = q( 3 ) + 1;

% Steps as described

% 1.
p1 = p(1); p2 = p(2);
q1 = q(1); q2 = q(2);

% 2.
bGuess = ( p2*sqrt(q2) - p1*sqrt(q1) ) / ( (p2-p1)*sqrt(q1)*sqrt(q2) );
aGuess = ( 1 - bGuess*sqrt(q1) ) / ( p1 * sqrt(q1) );

% 3.
p3 = p(3);
q3Guess = 1 / ( aGuess*p3 + bGuess )^2;

tol = 1e-7; % Use tolerance rather than == comparison to avoid float issues

if abs( q3Guess - q(3) ) < tol
% success
aFit = aGuess;
bFit = bGuess;
else
% p1, p2 or p3 is an outlier! Repeat using other points
% If there's known to be only one outlier, this should give the result
p1 = p(4); p2 = p(5);
q1 = q(4); q2 = q(5);
bFit = ( p2*sqrt(q2) - p1*sqrt(q1) ) / ( (p2-p1)*sqrt(q1)*sqrt(q2) );
aFit = ( 1 - bFit*sqrt(q1) ) / ( p1 * sqrt(q1) );
end

% Validate
fprintf( 'a is valid: %d, b is valid: %d\n', abs(a-aFit)<tol, abs(b-bFit)<tol )

关于matlab - 在不使用循环的情况下查找数据集中的奇数点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55241683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com