1

Данные, которые у меня есть, в этом формате в текстовом файле:

#REY2_0  REY1_0  alpha1     alpha2   omega

100      200    (-0.1,0)    (1,0)   (0.94379237,-0.052310783)

Список значений довольно длинный. Мне нужно найти значения REY2_0 и REY1_0, для которых значение второй части омеги равно 0 (под секундой я бы подразумевал значение -0.052310783 в приведенном выше случае). Могу ли я использовать gnuplot, чтобы выполнить эту операцию поиска и построить REY2_0 v/s REY1_0? Кроме того, поскольку большинство значений не точно равно нулю, я также хотел бы получить значения REY2_0 и REY1_0, для которых первые три цифры равны нулю (т. Е. Имеют вид 0.000xxxxxx)

1 ответ1

0

Давайте заранее очистим ваши данные от ( и ) . Хорошим вариантом является команда linux sed(column -t даст хороший формат)

  sed 's/[(,)]/\t/g' data.dat | column -t > data02.dat

где мы предполагаем, что ваш исходный файл называется data.dat и что мы создадим новый файл с именем data02.dat . Новый файл будет иметь 8 столбцов. В gnuplot вы можете получить доступ к одному столбцу с помощью опции using ($1):($8) чтобы использовать данные из первого столбца в качестве x и данные из восьмого столбца для y .

Теперь хитрость: определите функцию, которая будет отвечать с y, если оно удовлетворяет условию, и с плюс бесконечным, если это не так. Это потому, что gnuplot пропустит y со значениями бесконечными. Так в gnuplot вы можете написать

myf(y,t)= t == 0 ? y : 1.0/0.
plot 'data2.dat' us ($1):(myf($2,$8))

Конечно, вы можете сделать это более компактным способом, но написать так, ИМХО, это более понятно.

Для второго вопроса можно установить другое условие в функции

myf2(x,y)= ( 0.001 > abs(x) ) && ( 0.001 > abs(y) ) ? y : 1.0/0
plot 'data2.dat' us ($1):(myf2($1,$2))

где abs(x) возвращает абсолютное значение числа (число без знака).

Примечание: хорошо, я ленивый вместо того, чтобы using я пишу только us . Гнуплот это понимает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .