Построение функции пиков в Октаве не дает правильного графика
Я пытаюсь использовать octave для выполнения проекта аппроксимации данных, но у меня возникли некоторые проблемы с тестированием некоторых основных вещей. У меня не очень большой опыт общения с Октавом, поэтому я надеялась, что кто-нибудь укажет мне правильное направление.
Я пытаюсь сгенерировать список точекx,y
, используя последовательность Холтона. Я хочу подключить эти точки x,y
в функцию peaks
, чтобы получить значения пиков z
для этих координат. Далее, я хочу построить эти x,y,z
точки, чтобы быть уверенным, что мой сюжет напоминает пиковый сюжет, но мой сюжет выглядит неправильно.
Вот код:
%13 for this example to compare to meshgrid
N = 13;
%creates a halton sequence for N and scales it between -3 to 3
seq = haltonseq(N, 2) * 6 – 3;
%save the x,y coordinate from the halton sequence
X = seq(:,1);
Y = seq(:,2);
%convert the x,y vector in matrixes
X = repmat(X, 1, N)';
Y = repmat(Y,1,N);
%get the z values for x,y
Z = peaks(X, Y);
%plot my x,y,z values
surf(X,Y,Z);
%plot meshgrid to compare to
[mX mY] = meshgrid(-3:0.5:3);
mZ = peaks(mX, mY);
surf(mX, mY, mZ);
Последовательность Холтона верна, но я включу ее для проверки. Это после того, как он был масштабирован, чтобы быть между -3
и 3
:
seq =
0.00000 -1.00000
-1.50000 1.00000
1.50000 -2.33333
-2.25000 -0.33333
0.75000 1.66667
-0.75000 -1.66667
2.25000 0.33333
-2.62500 2.33333
0.37500 -2.77778
-1.12500 -0.77778
1.87500 1.22222
-1.87500 -2.11111
1.12500 -0.11111
График Сетки:
График Холтона N = 13
:
График Холтона N = 300
:
Теперь, в меру моего понимания этого код, график последовательности Холтона не должен выглядеть так, как он выглядит, и по мере увеличения N
он должен больше напоминать граф meshgrid
, но он сохраняет свою прежнюю деформированную форму. Я не уверен, где я иду неправильно, может ли кто-то указать мне правильное направление?
1 ответ:
Быстрый взгляд на ваши
X
иY
показывает проблему:Как вы можете видеть, они не отсортированы должным образом. При построении графика порядок (обычно) имеет значение; см. ниже объяснение. Добавление следующих двух строк послеoctave:33> X X = 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 0.00000 -1.50000 1.50000 -2.25000 0.75000 -0.75000 2.25000 -2.62500 0.37500 -1.12500 1.87500 -1.87500 1.12500 octave:34> Y Y = -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 -1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -2.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 -0.33333 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 -1.66667 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 0.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 2.33333 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -2.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 -0.77778 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 1.22222 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -2.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111 -0.11111
repmat
исправляет это:X = sort(X,2); Y = sort(Y,1);
Вот результат:
Объяснение
Проблема заключается в том, что при построении графиков, где линии должны быть проведены между точками, имеет значение порядок. Иллюстрировать, рассмотрим этот небольшой пример:x1 = [1 2 3 4]; x2 = [3 1 4 2]; plot(x1,x1.^2); plot(x2,x2.^2);
Эти две точки будут изображены точно так же, но в другом порядке. Поэтому линии, соединяющие их, будут выглядеть иначе:
Заговор для
x1
:Сюжет для
x2
: