Объявление двух массивов в gnuplot и построение их одного относительно другого. - PullRequest
0 голосов
/ 21 января 2019

Gnuplot версии 5.2 поддерживает массивы. Как указано здесь , можно объявить одномерные массивы и построить их

array A[100]
do for [i=1:100] { A[i] = sin(2*pi*i/100.) + 0.1*rand(0) }
plot A

Это матрица A с индексом i.

Есть ли способ иметь два одномерных массива (например, x и y) и построить их y vs x.

OR

Объявите двумерный массив A и постройте второй столбец A относительно первого столбца A?

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Есть ли какая-то особая причина, по которой вы хотите сначала размещать данные в массивах?

Поскольку вы заполняете свои массивы значениями функций, вы также можете наносить две функции (или, как вы говорите, два столбца 2D-массива) прямо друг на друга, без предварительного определения массивов в цикле do for,Просто определите некоторые функции и нанесите их друг на друга.Используйте set samples для определения количества точек и plot sample [] для установки диапазона.Я полагаю, это было бы проще, чем установить размер массива, выполнить цикл и "возиться" с индексом i, а также с диапазоном и / или смещениями.

### plot one function vs. another function
reset session

f(x) = sin(x) + 0.1*rand(0)
g(x) = cos(x) + 0.1*rand(0)

set samples 100
plot sample [0:2*pi] '+' u (f($1)):(g($1)) w lp pt 7 lc rgb "red"
### end of code

enter image description here

0 голосов
/ 22 января 2019

Ответ # 2 Если два массива A и B гарантированно имеют одинаковый размер, возможна более простая команда построения.Начнем с того, что все следующие команды построения эквивалентны.

plot A
plot A using 1:2
plot A using (column(1)):(column(2))
plot A using ($1):($2)
plot A using ($1):(A[$1])

Это связано с тем, что для построения графика массив A рассматривается как обеспечивающий два столбца информации: индекс i (столбец 1) изначение A [i] (столбец 2).Следуя стандартному синтаксису gnuplot, каждое поле в спецификаторе «using» команды plot может содержать либо пустой номер столбца, либо выражение в скобках.Внутри выражения на значение столбца можно ссылаться либо с помощью префикса знака $, либо с помощью функции column (i).

Из этого следует, что приведенная ниже команда отображает значения массива Bпротив значений массива A.

plot A using (A[$1]):(B[$1])
0 голосов
/ 22 января 2019

Ответ № 3 Вы спрашиваете, есть ли альтернатива сделать A двумерным массивом. Не совсем, но помните, что в gnuplot числа с плавающей точкой на самом деле являются сложными значениями. Таким образом, вы можете использовать действительные и мнимые компоненты каждого A [i], чтобы поместить его в плоскость x / y:

array A[36]
set angle degree
i = {0,1}       # i = sqrt(-1) as a complex value
do for [n=1:36] {
    A[n] = cos(real(10.*n)) + i * sin(real(10.*n))
}
plot A using (real(A[$1])):(imag(A[$1])) with lp

enter image description here

0 голосов
/ 21 января 2019

Хитрость в том, чтобы gnuplot генерировал набор сэмплов для построения графика. Вместо имени файла вы можете указать строку «+» для генерации набора выборок по одному измерению или «++» для генерации набора выборок по двум измерениям. Gnuplot называет эти «специальные имена файлов». В вашем случае вы хотите сгенерировать 100 сэмплов (целые числа от 1 до 100) и использовать каждый сэмпл в качестве индекса для ваших массивов.

array A[100]
array B[100]
do for [i=1:100] {
    A[i] = something
    B[i] = something else
}

plot sample [i=1:100] '+' using (A[i]):(B[i]) with linespoints

Ключевое слово "sample" гарантирует, что термин в квадратных скобках не будет неверно истолкован как установка горизонтального диапазона ("set xrange") графика.

Записи документации

  • помощь +
  • help специальные имена файлов
  • помощь в выборке
...