Portál AbcLinuxu, 14. května 2025 04:06

Dotaz: Gnuplot - součet křivek

26.1.2005 12:26 Martin Čížek | skóre: 20 | Praha
Gnuplot - součet křivek
Přečteno: 223×
Odpovědět | Admin
DD, nevíte zda lze v GNUplotu nějak provést součet křivek? Mám několik souborů s daty (x, y); křivka (funkce) z každého vzniká spojením čarami ("with lines"). Takto vzniklé funkce bych potřeboval sečíst. Problém je, že se hodnoty x v jednotlivých souborech nekryjí.

Pokud to Gnuplot neumí, byl bych vděčný za nasměrování na nějaký skriptík, který datové řady umí sečíst (sice bych si jej uměl si jej napsat, ale teď mne trochu tlačí čas).

Díky.
Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.1.2005 00:16 Martin Čížek | skóre: 20 | Praha
Rozbalit Rozbalit vše Re: Gnuplot - součet křivek
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem si to nakonec musel naprgat. Pokud by se to někomu hodilo, zde to je... Po aplikaci stačí na výstup v gnuplotu pustit plot 1:($2+$3+...)
#!/bin/bash
# USAGE: mergefuncs FILE...
# Martin Cizek <cizek@webland.cz>

[ $# -gt 0 ] || exit 1;

awk '
function complete_last()
{
    for (i = idx; i <= count; i++)
        res[i] = res[i] " 0"
    idx = 1
    have_prev = 0
}
BEGIN {
    xi = 0
    idx = 1
}
ARGIND < ARGC/2 {
    if (length($1))
        x[xi++] = (double)$1
    next
}
!sorted {
    count = asort(x)
    sorted = 1
    lastind = ARGIND
}
/[^ \t]/{
    if (lastind != ARGIND)
        complete_last()
    lastind = ARGIND
    while (idx <= count && x[idx] <= $1) {
        if ((have_prev && x[idx] == prev_x) || x[idx] == $1)
            res[idx] = res[idx] " " $2
        else if (have_prev && x[idx] >= prev_x)
            res[idx] = res[idx] " " (prev_y + ($2-prev_y)*(x[idx]-prev_x)/($1-prev_x))
        else
            res[idx] = res[idx] " 0"
        idx++;
    } 
}
/[^ \t]/&&!have_prev {
    have_prev = 1
    prev_x = (double)$1
    prev_y = (double)$2
}
END {
    complete_last()
    for (i = 1; i <= count; i++)
        print x[i] " " res[i]
}
' "$@" "$@"
Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
27.1.2005 09:10 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Gnuplot - součet křivek
a nevyřešilo by to
join -e 0 -j 1 files...
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
27.1.2005 09:39 Martin Čížek | skóre: 20 | Praha
Rozbalit Rozbalit vše Re: Gnuplot - součet křivek
Bohužel ne, protože hodnoty x jsou v různých souborech opravdu různé (jsou to časy zachycení paketu). Pro každou x-hodnotu z libovolného souboru se musí na výstup dát také lineární interpolace od všech ostatních funkcí.

Nicméně díky za tip...
Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
27.1.2005 11:25 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Gnuplot - součet křivek
jojo, fakt to nejde. Jde to kombinací cut, sort -q, join ale to je pak lepsi to udelat nejakym scriptem (ja tedy asi perlem).
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.