Как я могу построить свою функцию на сетке

Я новый пользователь MATLAB, и я пытаюсь построить функцию:

function [ uncertainty ] = uncertain(s1, s2, p)
%UNCERTAIN calculates the measurement uncertainty of a triangulation
% provide two coordinates of known stations and a target coordinate 
% of another point, then you get the uncertainty 
 [theta1, dist1] = cart2pol(p(1)-s1(1), p(2)-s1(2));
 [theta2, dist2] = cart2pol(p(1)-s1(1), p(2)-s2(2));
 theta=abs(pi-theta2-theta1);
 uncertainty = dist1*dist2/abs(sin(theta));
end

вызывается с помощью:

uncertain([0 0],[8 0],[4 4])

Я получаю один результат. Но я хочу всю поверхность и называется:

x=-2:.1:10;
y=-2:.1:10;
z = uncertain([0 0],[8 0],[x y]);
mesh(x,y,z)

Я получаю сообщение об ошибке: «Z должно быть матрицей, а не скаляром или вектором».

Как я могу изменить свой код, чтобы моя функция рисовала поверхность?

Заранее спасибо. Ральф.


person Ralf K.    schedule 05.01.2012    source источник


Ответы (1)


Во-первых, я думаю, что в вашей функции есть ошибка: ваш [theta2, dist2] = cart2pol(p(1)-s1(1), p(2)-s2(2)); должен иметь th first s1 как s2.

Затем, чтобы получить векторный ответ для ваших входных векторов, вы должны изменить свой p(i) (который выбирает i-й элемент p) на p(i,:), который выберет первую i-ю строку из p.

После этого вы меняете умножение (*) на поэлементное умножение (.*).

В итоге:

function [ uncertainty ] = uncertain(s1, s2, p)
%UNCERTAIN calculates the measurement uncertainty of a triangulation
% provide two coordinates of known stations and a target coordinate 
% of another point, then you get the uncertainty
% target coordinates p are 2xn
% output uncertainty is 1xn
 [theta1, dist1] = cart2pol(p(1,:)-s1(1), p(2,:)-s1(2));
 [theta2, dist2] = cart2pol(p(1,:)-s2(1), p(2,:)-s2(2));
 theta=abs(pi-theta2-theta1);
 uncertainty = dist1.*dist2./abs(sin(theta));
end

Единственные изменения: p(i) -> p(i,:) и *->.* и /->./.

Чтобы получить поверхность, вы используете meshgrid для получения всех наборов координат (x,y) в сетке, сглаживаете их в матрицу 2xn для uncertain, а затем расширяете их обратно в сетку для построения. Пример:

x=-2:.1:10;  % 121 elements
y=-2:.1:10;  % 121 elements
[xs,ys]=meshgrid(x,y); % xs and ys are each 121 x 121
zs = uncertain([0 0],[8 0],[xs(:) ys(:)]'); %get zs, being 1x(121*121) ie 1x14641
% Reshape zs to be 121x121 in order to plot with mesh
mesh(xs,ys,reshape(zs,size(xs)))

Примечание: вы получите много действительно больших чисел, потому что когда theta равно 0 или pi (или почти), потому что тогда вы делите (почти) 0.

person mathematical.coffee    schedule 05.01.2012
comment
Спасибо за Ваш ответ. Я пытаюсь понять ваши модификации. Но результат довольно неожиданный, потому что углы должны быть около 90°, а значит, sin(угол) должен быть около 1. У меня есть уродливый код Java, создающий такое изображение: pastehtml.com/view/bjowk6rbg.html - person Ralf K.; 05.01.2012
comment
Но в моем коде Matlab еще отсутствует ограничение в 100, например: неопределенность = макс (неопределенно, 100) по координатам И границы должны быть сужены. - person Ralf K.; 05.01.2012
comment
Я обнаружил еще одну ошибку в своем коде: три угла должны быть равны 180°, потому что они должны быть тремя внутренними углами треугольника (s1,s2,p). - person Ralf K.; 05.01.2012
comment
Но theta2 = cart2pol... возвращает внешний угол на станции 2, значит, theta должно быть theta2-theta1 ? - person Ralf K.; 05.01.2012
comment
Код хорош тем, что он векторизует версию, которую вы написали в своем вопросе, - я полагаю, что неожиданные результаты связаны с проблемами в вашей математике (я не могу вам помочь). Почему бы вам не попробовать выполнить расчет вручную для одного p, убедиться, что результат соответствует вашим ожиданиям, а затем использовать вашу функцию uncertain, которая с ним согласна? - person mathematical.coffee; 06.01.2012