mean, median, variance ?



  • Gibt es in C standardmäßig Funktionen zur Berechnung des Mittelwertes, Medians oder der Varianz einer Wertemenge, beispielsweise in math.h?

    Oder hat jemand, wenn das nicht der Fall sein sollte, einen Link zum entsprechenden Quellcode?

    Mir ist natürlich klar, dass das ziemlich triviale Funktionen sind, aber ich bin ziemlicher C/C++-Noob und programmiere hauptsächlich in MATLAB, wo sowas zum Standard-Sprachumfang gehört.


  • Mod

    In C nein, in C++ jain. Ich bin mir anhand deiner Frage nicht sicher, ob du C oder C++ machst. Mit jain bei C++ meine ich, dass es allgemeine Standardalgorithmen gibt, um mit Wertemengen zu arbeiten. Es ist trivial, diese dazu zu bringen, Mittelwert, Median und Varianz zu berechnen.

    Und wie du selbst sagst, ist es ebenfalls sehr einfach, diese Funktionen in C selber zu schreiben.



  • Ich wollte mir halt den "Aufwand" sparen, diese Funktionen auch noch selber zu coden, da sie wahrscheinlich allein im Netz tausendfach vorhanden sind. Ich weiß halt nur nicht, wo ich suchen soll.

    Und benutzen tu ich C im Rahmen der MEX-Schnittstelle zu MATLAB.



  • Warum willst du das dann unbedingt in C implementieren wenn du es eh im Rahmen von Matlab verwenden willst? Teile dein Hauptprogramm (das du aus welchen Gründen auch immer nicht komplett in Matlab schreiben kannst) halt auf in mehrere Mex-Functions die du dann halt entsprechend aus Matlab aufrufst?



  • Das Problem ist, dass es sich dabei um eine Bildverarbeitungsoperation handelt, bei der jedes Bildpixel im Rahmen zweier verschachtelter for-Schleifen "abgelaufen" werden muss. D.h. der Rahmen meiner Funktion MUSS in C statt finden, weil MATLAB extremst(!) langsam ist, was for-Schleifen angeht.



  • Ja, Matlab und sein Kack-Interpreter...

    Wenn du es nicht als nicht-schleifenausdruck formuliert bekommst, okay, dann musst halt alles in Mex-Functions machen.



  • Hier mal ein kleines Code-Beispiel, vielleicht kennt sich ja jemand aus:

    #include <math.h>
    #include "mex.h"
    #include "matrix.h"
    
    void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
    {
    int rows, cols;
    float* image_in;
    float* image_out;
    float* ppix;
    float* pmean;
    mwSize ndim;
    const mwSize *dims;
    mxArray *pix;
    mxArray *mean;
    
    rows = (int)mxGetM(prhs[0]);
    cols = (int)mxGetN(prhs[0]);
    
    image_in = mxGetData(prhs[0]);
    
    ndim = mxGetNumberOfDimensions(prhs[0]);
    dims = mxGetDimensions(prhs[0]);
    
    plhs[0] = mxCreateNumericArray(ndim, dims, mxSINGLE_CLASS, mxREAL);
    image_out = mxGetData(plhs[0]);
    
    pix = mxCreateNumericMatrix(9, 1, mxSINGLE_CLASS, mxREAL);
    ppix = mxGetData(pix);
    
    mean = mxCreateNumericMatrix(9, 1, mxSINGLE_CLASS, mxREAL);
    pmean = mxGetData(pix);
    
    for(j = 0; j < cols; j++) // loop over cols
    {
    for(i = 0; i < rows; i++) // loop over rows
    {
    ppix[0] = image_in[(rows*j-1)+i-1];
    ppix[1] = image_in[(rows*j-1)+i];
    ppix[2] = image_in[(rows*j-1)+i+1];
    ppix[3] = image_in[(rows*j)+i-1];
    ppix[4] = image_in[(rows*j)+i];
    ppix[5] = image_in[(rows*j)+i+1];
    ppix[6] = image_in[(rows*j+1)+i-1];
    ppix[7] = image_in[(rows*j+1)+i];
    ppix[8] = image_in[(rows*j+1)+i+1];
    
    mexCallMATLAB(1, &mean, 1, &pix, "mean");
    }
    }
    return;
    }
    

    Ich weiß, dass der Code nicht komplett ist, ich wollte nur aufzeigen, in welche Richtung mein Problem geht. Möchte halt Varianz und Median genau so berechnen lassen, wie den Mittelwert und die jeweiligen Werte in Vektoren/Arrays speichern, die in ihrer Länge der Anzahl meiner überprüften Nachbarschaften entsprechen, z.B. 9.
    Zuletzt möchte ich die Werte in den drei Arrays (Mittelwert, Median, Varianz) mittels der MATLAB-Funktionen min und max vergleichen.

    Kann mir da irgendjemand auf die Sprünge helfen und dazu beitragen, meine Verwirrung mit den ganzen Zeigern, C-Arrays, MATLAB-Arrays etc. pp. zu entwirren?


Anmelden zum Antworten