C++Guns – RoboBlog blogging the bot

26.02.2015

rosettacode - Simple moving variance

Filed under: Allgemein — Tags: , — Thomas @ 11:02

As mentioned in my earlier post original C++ rosettacode sucks.
Here is my example for a simple moving variance and standard deviation. One has to add only a few lines of code:


in add()
...
    sum2 = sum2 - oldValue*oldValue + value*value;
...

double var() const {
    return sum2/size - avg()*avg();
}

double std() const {
    return std::sqrt(var());
}
Data1 Period 3
Added 1 avg:        1 var:        0 std: 0
Added 2 avg:      1.5 var:     0.25 std: 0.5
Added 3 avg:        2 var: 0.666667 std: 0.816497
Added 4 avg:        3 var: 0.666667 std: 0.816497
Added 5 avg:        4 var: 0.666667 std: 0.816497
Added 5 avg:  4.66667 var: 0.222222 std: 0.471405
Added 4 avg:  4.66667 var: 0.222222 std: 0.471405
Added 3 avg:        4 var: 0.666667 std: 0.816497
Added 2 avg:        3 var: 0.666667 std: 0.816497
Added 1 avg:        2 var: 0.666667 std: 0.816497

Data2 Period 8
Added 2 avg:        2 var:        0 std: 0
Added 4 avg:        3 var:        1 std: 1
Added 4 avg:  3.33333 var: 0.888889 std: 0.942809
Added 4 avg:      3.5 var:     0.75 std: 0.866025
Added 5 avg:      3.8 var:     0.96 std: 0.979796
Added 5 avg:        4 var:        1 std: 1
Added 7 avg:  4.42857 var:  1.95918 std: 1.39971
Added 9 avg:        5 var:        4 std: 2

ToDo: add Skewness and Kurtosis

23.02.2015

c++ CYK implementation

Filed under: Allgemein — Tags: — Thomas @ 14:02

Die Wikipedia Artikel zum Cocke-Younger-Kasami-Algorithmu kann man vergessen. Man kapiert nichts. Hab auf youtube ein 15min Video [1] von Benny Neugebauer dazu gefunden. Wunderbar, alles gleich verstanden :)
Hab ihn mal schnell in C++ implementiert. Hier die Hauptschleife:


    /*
    Für j = 2 ... n
      Für i = 1 ... n - j + 1
        Für k = 1 ... j - 1
          Setze V_{i,j} := V_{i,j} + { l | \exists B,C in N ((l -> BC) in P and B in V_{i,k} and C in V_{i + k, j - k}) \}

    Falls S \in V_{1,n}, stoppe und gib "w wird von G erzeugt" aus
    Stoppe und gib "w wird nicht von G erzeugt" aus
    */
    for(size_t row=1; row < n; row++) {
//        cout << "row " << row << "\n";
        for(size_t col=0; col < n-row; col++) {
//            cout << "col " << col << "\n";
            for(size_t k=0; k < row; k++) {
                const auto &e1 = V.at(k, col);
                const auto &e2 = V.at(row-k-1, col+k+1);

                for(size_t i=0; i < e1.size(); i++) {
                    for(size_t j=0; j < e2.size(); j++) {
//                        cout << "Check " << e1.at(i) << " " << e2.at(j) << "\n";
                        const Production::String toTest({e1.at(i), e2.at(j)});
                        for(const Production& p : P) {
                            if(p.right == toTest) {
                                // uniq append
                                if(contains(V.at(row, col), p.left) == false) {
                                    V.at(row, col).push_back(p.left);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

Für jeden Matrixeintrag in der oberen linken Dreiecksmatrix:
Für jeden Eintrag oberhalt in der Spalte und Diagonal nach oben:
Schaue nach ob die Konkatenation der beiden Einträge in der rechten Seite der Produktionsregeln vorkommen:
Ja) Linke Seite der Produktion in die Matrix eintragen.

Steht am Ende in der letzten Zeile, erste Spalte das Startsymbol, dann kann das Wort erkannt werden.

CYK.zip

[1] https://www.youtube.com/watch?v=JugIgxUyA4Q

18.02.2015

rosettacode - Simple moving average

Filed under: Allgemein — Tags: , , — Thomas @ 12:02

http://rosettacode.org/wiki/Averages/Simple_moving_average#C.2B.2B

The original rosetta C example shows the usage of variable function arguments. The C++ example shows how to implement a circular buffer. They are confusing and inefficient. My Version shows how to implement a simple moving average using modern c++ techniques.


#include < iostream >
#include < vector >

class SMA {
public:
    SMA(int period) : values(period), sum(0.0), idx(0), size(0) {
    }

    void add(double value) {
        const size_t period = values.size();
        // here is the magic. Update sum and vector in place
        sum = sum - values[idx] + value;
        values[idx] = value;

        // this implements the circular buffer
        idx = (idx+1)%period;
        if(size+1 <= period) {
            ++size;
        }
    }

    double avg() const {
        return sum/size;
    }

private:
    // store the last seen values
    std::vector values;
    // store the sum. so we dont have to recalculate it every time
    double sum;
    // the next element in the buffer we can override
    int idx;
    // ho many values was allready inserted. This is usually the same as the given periodb
    size_t size;
};

int main() {
    SMA foo(3);
    SMA bar(5);

    std::vector data = { 1, 2, 3, 4, 5, 5, 4, 3, 2, 1 };

    for(auto &val : data) {
        foo.add(val);
        std::cout << "Added " << val << " avg: " << foo.avg() << std::endl;
    }
    std::cout << std::endl;

    for(auto &val : data) {
        bar.add(val);
        std::cout << "Added " << val << " avg: " << bar.avg() << std::endl;
    }

    return 0;
}


Flussschlauch

Filed under: Allgemein — Thomas @ 10:02
Original Fluss Daten

Original Fluss Daten

Original Vermaschung

Original Vermaschung

Original Vermaschung

Original Vermaschung

With intersecting

With intersecting

Remove intersecting

Remove intersecting

refine + without intersecting

refine + without intersecting

Neuer Ansatz: cross Segmente die sich schneiden kürzen

Neuer Ansatz: cross Segmente die sich schneiden kürzen

refine + cross segmente kürzen

refine + cross segmente kürzen

refine + verbessert

refine + verbessert

need more nodes

need more nodes

Flussschleife interpoliert

Flussschleife interpoliert

0.5m refine Flussschleife interpoliert

0.5m refine Flussschleife interpoliert

11.02.2015

replace templates with c++14 auto

Filed under: Allgemein — Tags: — Thomas @ 21:02

#include < iostream >

template< class T >
T func1(T t) { return t; }

auto func2(auto t) { return t; }

int main() {
  std::cout << func1(1) << func1(2.2) << func2(3) << func2(4.4);
}

autoauto.cpp:6:18: note: deduced return type only available with -std=c++1y or -std=gnu++1y

g++ --std=c++14 autoauto.cpp 
./a.out 
12.234.4

09.02.2015

gfortran bug

Filed under: Allgemein — Tags: — Thomas @ 18:02

Jo en Bug. So assigment subroutine und gfort 4.8 4.9. Vllt geht es in 5.0 ja wieder.

gfortramnbug.F90

02.02.2015

normalized-rgb

Filed under: Allgemein — Tags: , — Thomas @ 11:02

Als ich gestern etwas mit OpenCV gearbeitet habe, bin ich auf eine
interesannte Seite gestossen [1] . Es wird dort von normailsierten RGB
geredet. Dabei wird getrennt für jeden Kanal, der Pixelwert durch die
Summe des Pixels über alle 3 Kanäle geteilt.

R’ = R/(R+G+B)
G’ = G/(R+G+B)
B’ = B/(R+G+B)

Dabei geht die Lichtinformation im Bild verloren. Ich finde das eine
interesannte Ausgangslage für weitere Berechnungen. Oft ist doch nur die
Farbe einzelner Objekte wichtig, nicht aber wie sie beleuchtet wurden.

Es sind nur noch 2 Byte pro Pixel, statt 3 Byte, notwenig.
R' + G' + B'=1
B' = 1 - R' - G'

Ein Angabe von 2 der 3 Werte ist also hinreichend. Damit kann der Farbort
charakterisiert werden, nicht aber die absolute Intensit¨t des Farbreizes. Das
heißt die Länge des Farbvektors wird nicht angegeben.

[1] http://www.aishack.in/tutorials/normalized-rgb/

more crazy C

Filed under: Allgemein — Tags: — Thomas @ 09:02

#include

#define CACHE 256
enum { h_unknown = 0, h_yes, h_no };
unsigned char buf[CACHE] = {0, h_yes, 0};

int happy(int n)
{
int sum = 0, x, nn;
if (n < CACHE) { if (buf[n]) return 2 - buf[n]; buf[n] = h_no; } for (nn = n; nn; nn /= 10) x = nn % 10, sum += x * x; x = happy(sum); if (n < CACHE) buf[n] = 2 - x; return x; } int main() { int i, cnt = 8; for (i = 1; cnt || !printf("\n"); i++) if (happy(i)) --cnt, printf("%d ", i); printf("The %dth happy number: ", cnt = 1000000); for (i = 1; cnt; i++) if (happy(i)) --cnt || printf("%d\n", i); return 0; } from http://rosettacode.org/wiki/Happy_numbers#C

stuff

Filed under: Allgemein — Tags: — Thomas @ 09:02

traceroute -m 100 216.81.59.173

Powered by WordPress