Fragen zur SI-Sprache - Seite 11

 
TheXpert:

Zeiger auf ein Datenstück der Größe 4 oder 8 Byte.

Die Größe hängt wegen der Ausrichtung von der Plattform ab. Wenn Sie etwas wie pragma pack 1 verwenden, wird die Größe gleich sein (wahrscheinlich 1 Byte)

Manchmal schaue ich auch in VS C++, kompiliere im asm-Listing-Modus und schaue es mir dann an, dann wird vieles klar. Ja, es klingt beängstigend, aber asm ist die absolute Wahrheit in letzter Instanz. Und die Sprache ist nicht schwer zu verstehen. Es ist schwer, es richtig zu schreiben))

 
Это рекурсия просто. Быстрая сортировка как раз таки и применяет рекурсивный вызов функции. О принципах, преимуществах и недостатках ее использования можете почитать в интернете. И да, это применительно к любому ЯП. В кратце скажу, что главное требование рекурсии - это то, что бы последующий вызов рекурсии приближал алгоритм к завершению. Ну и главный недостаток это требование к оперативной памяти при большое обработке данных, так как каждый вызов такой рекурсии будет блокировать память.... Простой пример с рекурсией на том же си и нахождению факториала в 2 вариациях. 
1) Рекурсия внутри 1 функции:

long long Factorial(int n){
        if(n == 1) return 1;
        return n * Factorial(n-1); // Здесь выполнил требование приближение рекурсии к завершению(то есть n стремится к 1(где исполнится условие выше))
}

2) Рекурсия между несколькими функциями:

int Fun2(int); // Прототип.
int Fun1(int i){
        if(i == -5){return i;}
        return i + Fun2(i-1);
}

int Fun2(int i){
        if(i == -5){return i;}
        return i + Fun1(i-1);
}
 
Gleb Krel:

Ja, danke... wie man so schön sagt, ich wusste es, hatte es aber vergessen, da ich kein Programmierer bin und es selten mache :)

 

Ich möchte diesen Quellcode nach MQL portieren, aber ich bin nicht sicher, ob ich std::deque behandeln kann.

#include <deque>

class net
{   std::deque<float*> w;    // весовые коэффициенты (== это образцам)
    const unsigned     n;    // количество входов сети
    
    float activation(float v) const
    {   return v>n?n:v<0?0:v;
    }
public:
    net(unsigned numInputs):n(numInputs){}
    ~net(void)
    {   for(unsigned i(0); i<w.size();) delete [] w[i++];
    }
    unsigned learnImage(const float* const image)
    {   w.push_back( (float*)memcpy( new float[n],image, sizeof(float)*n) );
        return w.size();
    }
    unsigned recognizeImage(const float* const image) const
    {   float*  axons( (float*)memset(new float[w.size()],0,sizeof(float)*w.size()) );
        float   sum1(.0), sum2(.0), e(0.95 f/w.size());
        unsigned i,j;

        for(i=0; i < w.size(); ++i)    // цикл инициализации сети
        {   for(j=0; j < n; ++j)
                axons[i] += image[j]*w[i][j];
            sum1 += axons[i] = activation(0.5 f*(axons[i]+float(n) ) );
        }
                
        while( sum2 != sum1 )        // цикл пока выходы сети изменяются
        {   sum1 = 0.0 f * ( sum2 = sum1 );
            for(i=0; i < w.size(); ++i)
                sum1 += axons[i] = activation( axons[i]-e*(sum2-axons[i]) );
        }
        for(i=w.size(); i!=-1 u && !axons[i--];);    // поиск активного аксона сети 
        delete [] axons;
        return i;
    }


};



int _tmain(int argc, _TCHAR* argv[])
{  // входы можно сделать и целочисленными, роли играть не будет
    float a1[4][15] = {{1.,1.,1.,  1.,-1.,-1.,  1.,-1.,-1.,  1.,-1.,-1.,  1.,1.,1.},// символ С
                        {1.,1.,1.,  1.,-1.,-1.,  1.,1.,-1.,   1.,-1.,-1.,  1.,1.,1.}, // Символ E
                        {1.,1.,1.,  1.,-1.,1.,   1.,-1.,1.,   1.,-1.,1.,   1.,1.,1.}, // Символ О
                        {1.,1.,1.,  1.,-1.,1.,   1.,-1.,1.,   1.,-1.,1.,   1.,1.,1.}  // искаженный
                      };

    net n(15);
    n.learnImage( a1[0] );
    n.learnImage( a1[1] );    
    n.learnImage( a1[2] );
    return n.recognizeImage( a1[3] );
}


entnommen von hier:https://habr.com/ru/sandbox/43916/

SZZY: gegoogelt und keinen anderen Hamming-Quellcode gefunden, Links zu anderen Quellen sind willkommen (nicht das Hopfield-Netzwerk!!! - google gibt sie immer zusammen)

 
Igor Makanu:

Ich möchte diesen Quellcode nach MQL portieren, aber ich bin nicht sicher, ob ich std::deque behandeln kann.

es ist eine bidirektionale Liste. der obige Code hat nur push_back so Chancen sind Sie es mit einem Vektor ersetzen können.

Wenn nicht, können Sie eine einfache Implementierung von deque über Array mit einer Reserve vom Anfang und Ende machen. in STL ist es irgendwie auf diese Weise implementiert.

 
Andrei Trukhanovich:

Dies ist eine bidirektionale Liste. In dem obigen Code gibt es nur push_back, so dass es eine Chance, dass es durch einen Vektor ersetzt werden kann.

Falls nicht, können Sie eine einfache Implementierung von deque über Array mit Start- und Endredundanz durchführen.

Ich habe std::deque gegoogelt und es ist wie Sie schreiben, aber... Ich weiß nicht, wie ich es verwenden soll, und ersetze es einfach durch einen Vektor... Im Allgemeinen ist das Beispiel ein Tutorium, ich würde es nicht vermasseln wollen und sicher sein, dass es so ist, wie es falsch funktionieren soll ))))

ZS: Es gibt auch ein Beispiel in F# - aber ich denke, das ist zu viel ;)

 
Igor Makanu:

Ich möchte diesen Quellcode nach MQL portieren, aber ich bin mir nicht sicher, ob ich std::Alert( n.recognizeImage( a1_3 ) ) handhaben kann;

entnommen von hier:https://habr.com/ru/sandbox/43916/

SZY: gegoogelt, dass ich nicht auf die Schnelle andere Hamming-Netzwerk-Quellen gefunden habe, Links zu anderen Quellen sind auch willkommen (es ist nicht net Hopfield!!! - google gibt sie immer zusammen)

Igor, ich glaube nicht, dass es sinnvoll ist, ein Deque zu schreiben, ein Vektor wird in den allermeisten Fällen ausreichen. Ich habe Ihr Beispiel mit einem Vektor aus dem Thread über stl neu geschrieben:

#include <myincl/1_mystd.mqh>

template <typename T>
void fill_vector_from_array(vector_fund<T> &dest, const T &src[]) {
   dest.clear();
   for (int i = 0;  i < ArraySize(src);  ++ i)
      dest.push_back(src[i]);
}
template <typename T>
void fill_vector(vector_fund<T> &dest, T val) {
   for (uint i = 0;  i < dest.size();  ++ i)
      dest.a[i] = val;
}

class net
{   vector_ref<vector_fund<float>> w;    // весовые коэффициенты (== это образцам)
    const uint n;                        // количество входов сети
    
    float activation(float v) const {
        return v>n?n:v<0?0:v;
    }
public:
    net(unsigned numInputs):n(numInputs){}
    unsigned learnImage(const float &image[]) {
        vector_fund<float> tmp;
        fill_vector_from_array(tmp, image);
        w.push_back(tmp);
        return w.size();
    }
    unsigned recognizeImage(const float &image[]) const {   
        vector_fund<float> axons(this.w.size());
        fill_vector<float>(axons, 0);
    
        float   sum1=.0, sum2=.0, e=0.95 f/w.size();
        unsigned i,j;
        vector_fund<float> image_vec;
        fill_vector_from_array(image_vec, image);
        
        for(i=0; i < w.size(); ++i) {   // цикл инициализации сети
            for(j=0; j < n; ++j)
                axons.a[i] += image_vec.a[j]*w.a[i].a[j];
            sum1 += axons.a[i] = activation(0.5 f*(axons.a[i]+float(n) ) );
        }
                
        while( sum2 != sum1 ) {       // цикл пока выходы сети изменяются
            sum1 = 0.0 f * ( sum2 = sum1 );
            for(i=0; i < w.size(); ++i)
                sum1 += axons.a[i] = activation( axons.a[i]-e*(sum2-axons.a[i]) );
        }
        for(i=w.size()-1; i!=(uint)-1 && !axons.a[i--];);    // поиск активного аксона сети 
        return i;
    }


};

unsigned fn() {
   // создал несколько массивов, отказывается мкл передавать многомерные массивы.
   float a1_0[15] = {1.,1.,1.,  1.,-1.,-1.,  1.,-1.,-1.,  1.,-1.,-1.,  1.,1.,1.}; // символ С
   float a1_1[15] = {1.,1.,1.,  1.,-1.,-1.,  1.,1.,-1.,   1.,-1.,-1.,  1.,1.,1.}; // Символ E
   float a1_2[15] = {1.,1.,1.,  1.,-1.,1.,   1.,-1.,1.,   1.,-1.,1.,   1.,1.,1.}; // Символ О
   float a1_3[15] = {1.,1.,1.,  1.,-1.,1.,   1.,-1.,1.,   1.,-1.,1.,   1.,1.,1.}; // искаженный

    net n(15);
    n.learnImage( a1_0 );
    n.learnImage( a1_1 );    
    n.learnImage( a1_2 );

    return n.recognizeImage( a1_3 );
}

void OnStart()
{
   Alert( fn() );
}

Ich will es nicht vermasseln und sicher sein, dass es nicht richtig funktioniert ))))

Um dies zu überprüfen, habe ich den Quellcode und den µl-Code getestet

    Alert( n.recognizeImage( a1_0 ) );
    Alert( n.recognizeImage( a1_1 ) );
    Alert( n.recognizeImage( a1_2 ) );
    Alert( n.recognizeImage( a1_3 ) );

in beiden Fällen erhalten: 1 1 0 4294967295

HH: Übrigens schien es einen Fehler im Quelltext zu geben - er ging über die Grenzen des Feldes hinaus (der Genosse vergaß, -1 hinzuzufügen)

for(i=w.size()-1; i!=-1 u && !axons[i--];);    // поиск активного аксона сети 
 
Vict:

Igor, ich glaube nicht, dass es sinnvoll ist, eine Deque zu schreiben, ein Vektor ist in den allermeisten Fällen ausreichend. Ich habe Ihr Beispiel mit dem Vektor aus dem Thread über stl neu geschrieben:

Um dies zu überprüfen, habe ich auf Pluses Quell- und µl-Code wie folgt ausgeführt

in beiden Fällen erhalten: 1 1 0 4294967295

HH: durch die Art und Weise, in den Quellcode zu sein schien ein Fehler - overrun Array (Genosse vergessen, -1 hinzufügen)

О! Das ging aber schnell! Danke HUMAN!!!