2d полиномиальная подгонка к табличным данным MATLAB

Я пытаюсь использовать 2D полиномиальную подгонку для своих табличных данных, мой формат данных точно такой же, как ссылка ниже: http://www.mathworks.de/help/toolbox/curvefit/brx2ldg-1.html#bso46rp-1

Я имею в виду, что у меня есть вектор X с длиной n, Y с длиной m и m*n Матрица Z, я хотел бы подогнать к моим данным многочлен 2d степени 5,

Мне интересно, есть ли в MATLAB какой-либо синтаксис для решения этой проблемы? как команда SFIT в IDL, http://star.pst.qub.ac.uk/idl/SFIT.html

У меня есть cftool и sftool, но видимо они для этой цели не годятся или скорее всего я не умею их применять.

и я знаю, что есть некоторый m.file, которым люди делятся в обмене файлами MATLAB Mathworks, пожалуйста, если вы знаете, что он работает правильно, предложите мне.

Буду признателен за любую помощь и комментарий.


person user1331843    schedule 06.09.2012    source источник
comment
Я также пытаюсь использовать Sfit в IDl, но мне не удалось его использовать, я был бы признателен за любую помощь.   -  person user1331843    schedule 07.09.2012
comment
Возможно, приведенные здесь ответы помогут вам stackoverflow. ком/вопросы/2963874/   -  person gevang    schedule 11.09.2012


Ответы (1)


Вы можете использовать polyfitn из файлового обмена и переформатировать свои данные, чтобы иметь 3 MxN x,y,z вектора.

Пример:

Предположим, у вас есть данные таблицы формы

N = 100; M = 80;
x = linspace(0, 1, M);
y = linspace(0, 1, N).';
z = bsxfun(@franke, x, y);

Создайте meshgrid вместо x и y вместо этого

N = 100; M = 80;
[x, y] = meshgrid(0:1:N, 0:1:M);
z = bsxfun(@franke, x, y);

(Обратите внимание, что unique(x) и unique(y) дадут вам исходные linspace значения строк и столбцов вашей таблицы.)

Используйте polyfitn, чтобы получить коэффициенты полинома 5-й степени.

p = polyfitn([x(:),y(:)], z(:), 5);

Вы можете дополнительно преобразовать результат в символьную форму для просмотра полинома, используя предоставленный polyn2sym(p)

>> pretty(polyn2sym(p))

                      5                           4                             4                         3   2
     90264379051097 X1         2537627280433653 X1  X2       7778045812403061 X1       6982058230382053 X1  X2
- ------------------------- - -------------------------- + ------------------------ - -------------------------- + ...
  2417851639229258349412352   38685626227668133590597632   604462909807314587353088   77371252455336267181195264
person gevang    schedule 11.09.2012
comment
но у меня есть векторы x, y и z как martix - person user1331843; 18.09.2012
comment
да, в своем ответе я предполагаю, что у вас есть это (строки 1-4 кода), и предлагаю, как вы можете получить из него удобное полностью матричное представление (строки 5-7). По сути, создайте meshgrid из ваших векторов x, y и оставьте матрицу z нетронутой. polyfitn затем можно применить, как показано. - person gevang; 18.09.2012
comment
Я сталкиваюсь с этой ошибкой; что я не знаю почему, я поставил свои данные на свой вопрос. не могли бы вы мне помочь? ??? Ошибка при использовании аргументов CAT ==> horzcat. Размеры несовместимы. - person user1331843; 26.09.2012
comment
единственное место, где вы можете получить эту ошибку, находится в [x(:),y(:)] внутри polyfitn. Помните, x, y изначально являются векторами, которые вы превращаете в матрицы с помощью meshgrid. Тогда, независимо от их исходной длины, будет работать выполнение [x(:),y(:)], т. е. объединение векторных матриц. - person gevang; 26.09.2012