Мне дан набор точек (p1,q1) (p2,q2) ... (p20,q20)
, которые удовлетворяют функции q = 1/(ap + b)^2
, за исключением того, что один из них не удовлетворяет данному соотношению .Значения a
и b
мне не даны.Все, что у меня есть, это два входа p
и q
в виде массивов.Мне нужно найти индекс точки, которая не удовлетворяет данному соотношению.
Я решил найти способ найти значения a
и b
, используя первые две пары (p1,q1)
и (p2,q2)
, и проверить, удовлетворяют ли оставшиеся точки функции для найденных значений.a
и b
.Результаты будут сохранены в логической матрице. Я хочу использовать логическую матрицу для выбора нечетной пары, но не могу продолжать дальше.
В частности, задача состоит в том, чтобы использовать векторизацию в MATLAB длянайдите странную точку, вместо того чтобы прибегать к циклам for .Я думаю, что мне придется сначала искать единственный логический ноль в любой строке.В этом случае индекс столбца этого нуля выберет мне нечетную точку.Но если во всех 4 строках имеется более одного нуля, то нечетной точкой является любая из первых двух пар.Мне нужна помощь в переводе этого в эффективный код в MATLAB.
Обратите внимание, что векторы p
и q
были названы x
и y
в приведенном ниже коде.
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