Построение функции пиков в Октаве не дает правильного графика


Я пытаюсь использовать 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, но он сохраняет свою прежнюю деформированную форму. Я не уверен, где я иду неправильно, может ли кто-то указать мне правильное направление?

Примечание: я использую этот код с Octave сейчас,но я также буду использовать его с Matlab позже, поэтому я пометил его как оба.
1 2

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:

Введите описание изображения здесь