t = [False, False, False, False, True, True, True, False, False,
True, True, True, True, False, False, False, False, False,
False, False, True, True, True, False]
indexes = []
counter = 0
for i in range(0, len(t)):
el = t[i]
if counter == 0:
if el:
indexes.append(i)
counter = i
else:
if (el == True) and (i - counter == 1):
indexes.append(i)
counter = i
else:
break
print(indexes)
Я адаптировал принятый ответ для построения массива с плавающей точкой, избегая использования временного файла. В нем float* data_
это массив, а size_t size_
его размер. Надеюсь, это кому-нибудь пригодится!
Приветствия,
Андрес
void plot(const char* name="FloatSignal"){
// open persistent gnuplot window
FILE* gnuplot_pipe = popen ("gnuplot -persistent", "w");
// basic settings
fprintf(gnuplot_pipe, "set title '%s'\n", name);
// fill it with data
fprintf(gnuplot_pipe, "plot '-'\n");
for(size_t i=0; i<size_; ++i){
fprintf(gnuplot_pipe, "%zu %f\n", i, data_[i]);
}
fprintf(gnuplot_pipe, "e\n");
// refresh can probably be omitted
fprintf(gnuplot_pipe, "refresh\n");
}
Вы можете создать сценарий gnuplot и запустить процесс, выполняющий gnuplot, для построения этого сценария из командной строки, или вы можете использовать один из предоставленных интерфейсов. Для C существует конвейерный интерфейс POSIX от Николаса Девилларда, доступный здесь: http://ndevilla.free.fr/gnuplot/ ... а версия C ++ на основе iostream доступна через git (см .: http://www.stahlke.org/dan/gnuplot-iostream/ )
Самый переносимый и, вероятно, самый простой way все равно будет вызывать gnuplot для построения сценария. Как упоминалось в sje397, проверьте свою документацию на наличие вызова system () в stdlib.h.
Кстати, есть также GNU plotutils, которая предлагает libplot, библиотеку для построения наборов данных, которую вы можете использовать в своем приложении. См .: http://www.gnu.org/software/plotutils/