Domande sul linguaggio SI - pagina 11

 
TheXpert:

puntatore a un pezzo di dati di dimensione 4 o 8 byte.

La dimensione dipende dalla piattaforma a causa dell'allineamento. Se usate qualcosa come pragma pack 1, la dimensione sarà la stessa (1 byte probabilmente)

A volte guardo anche in VS C++, compilo in modalità asm listing e poi lo guardo, molto diventa chiaro. Sì, sembra spaventoso, ma l'asm è la verità assoluta in ultima istanza. E il linguaggio non è difficile da capire. È difficile scriverlo correttamente))

 
Это рекурсия просто. Быстрая сортировка как раз таки и применяет рекурсивный вызов функции. О принципах, преимуществах и недостатках ее использования можете почитать в интернете. И да, это применительно к любому ЯП. В кратце скажу, что главное требование рекурсии - это то, что бы последующий вызов рекурсии приближал алгоритм к завершению. Ну и главный недостаток это требование к оперативной памяти при большое обработке данных, так как каждый вызов такой рекурсии будет блокировать память.... Простой пример с рекурсией на том же си и нахождению факториала в 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:

Sì, grazie... come si dice, lo sapevo ma l'ho dimenticato perché non sono un programmatore e lo faccio raramente :)

 

Voglio portare questo codice sorgente in MQL, ma non sono sicuro di poter gestire std::deque.

#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] );
}


preso da qui:https://habr.com/ru/sandbox/43916/

SZZY: ho cercato su Google e non ho trovato nessun altro codice sorgente di Hamming, i link ad altre fonti sono benvenuti (non la rete Hopfield!!! - google li dà sempre insieme)

 
Igor Makanu:

Voglio portare questo codice sorgente in MQL, ma non sono sicuro di poter gestire std::deque.

È una lista bidirezionale. il codice di cui sopra ha solo push_back quindi è possibile sostituirlo con un vettore.

se no, puoi fare una semplice implementazione di deque via array con una riserva dall'inizio e dalla fine. in STL è in qualche modo implementato in questo modo.

 
Andrei Trukhanovich:

Questa è una lista bidirezionale. nel codice di cui sopra c'è solo push_back quindi c'è la possibilità che possa essere sostituito da un vettore.

In caso contrario, si può fare una semplice implementazione del deque tramite array con ridondanza di inizio e fine.

Ho cercato su Google std::deque ed è come scrivi tu, ma... Non so come usarlo, e sostituirlo solo con un vettore... In generale, l'esempio è un tutorial, non vorrei sbagliare ed essere sicuro che è il modo in cui dovrebbe funzionare sbagliato ))))

ZS: C'è anche un esempio in F# - ma penso che sia troppo ;)

 
Igor Makanu:

Voglio portare questo codice sorgente in MQL, ma non sono sicuro di poter gestire std::Alert( n.recognizeImage( a1_3 ) );

preso da qui:https://habr.com/ru/sandbox/43916/

HZZ: googlato, che non ho trovato al volo altre fonti della rete di Hamming, i link ad altre fonti sono anche benvenuti (non è Hopfield netto!!! - google li dà sempre insieme)

Igor, non credo che sia ragionevole scrivere un deque, un vettore sarà sufficiente nella stragrande maggioranza dei casi. Ho riscritto il tuo esempio usando un vettore dal thread su stl:

#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() );
}

Non voglio sbagliare ed essere sicuro che dovrebbe funzionare in modo improprio ))))

Per verificare questo, ho testato il codice sorgente e il codice µl

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

in entrambi i casi ha ottenuto: 1 1 0 4294967295

HH: a proposito, sembra che ci sia un errore nella fonte - andando fuori dai confini dell'array (il compagno ha dimenticato di aggiungere -1)

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

Igor, non credo che sia ragionevole scrivere un deque, un vettore è sufficiente nella stragrande maggioranza dei casi. Ho riscritto il tuo esempio usando il vettore dal thread su stl:

Per verificarlo, ho eseguito su plus il codice sorgente e µl come

in entrambi i casi ha ottenuto: 1 1 0 4294967295

HH: a proposito, nel codice sorgente sembrava esserci un errore - overrun array (il compagno ha dimenticato di aggiungere -1)

О! È stato così veloce! Grazie HUMAN!!!

Motivazione: