Preguntas sobre la lengua SI - página 11

 
TheXpert:

puntero a un dato de tamaño 4 u 8 bytes.

El tamaño depende de la plataforma debido a la alineación. Si utiliza algo como pragma pack 1, el tamaño será el mismo (1 byte probablemente)

También a veces miro en VS C++, compilo en modo de listado asm y luego lo miro, se aclaran muchas cosas. Sí, parece que da miedo, pero el asm es la verdad absoluta en última instancia. Y el lenguaje no es difícil de entender. Es difícil escribirlo correctamente))

 
Это рекурсия просто. Быстрая сортировка как раз таки и применяет рекурсивный вызов функции. О принципах, преимуществах и недостатках ее использования можете почитать в интернете. И да, это применительно к любому ЯП. В кратце скажу, что главное требование рекурсии - это то, что бы последующий вызов рекурсии приближал алгоритм к завершению. Ну и главный недостаток это требование к оперативной памяти при большое обработке данных, так как каждый вызов такой рекурсии будет блокировать память.... Простой пример с рекурсией на том же си и нахождению факториала в 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í, gracias... como dicen, lo sabía pero lo olvidé ya que no soy programador y rara vez lo hago :)

 

Quiero portar este código fuente a MQL, pero no estoy seguro si puedo manejar 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] );
}


tomado de aquí:https://habr.com/ru/sandbox/43916/

SZY: busqué en Google y no encontré ningún otro código fuente de Hamming, los enlaces a otras fuentes también son bienvenidos (¡¡¡no la red de Hopfield!!! - Google siempre los da juntos)

 
Igor Makanu:

Quiero portar este código fuente a MQL, pero no estoy seguro si puedo manejar std::deque.

es una lista bidireccional. el código anterior sólo tiene push_back, así que es probable que puedas sustituirlo por un vector.

si no, se puede hacer una implementación simple de deque vía array con una reserva del principio y del final. en STL se implementa de alguna manera así.

 
Andrei Trukhanovich:

esta es una lista bidireccional. en el código anterior sólo hay push_back por lo que existe la posibilidad de que sea sustituido por un vector.

Si no, puedes hacer una implementación simple de deque vía array con redundancia de inicio y fin.

He buscado en Google std::deque y es como escribes, pero... No sé cómo usarlo, y sólo sustituirlo por un vector... En general, el ejemplo es un tutorial, no me gustaría meter la pata y estar seguro de que es la forma en que se supone que funciona mal ))))

ZS: También hay un ejemplo en F# - pero creo que es demasiado ;)

 
Igor Makanu:

Quiero portar este código fuente a MQL, pero no estoy seguro de poder manejar std::Alert( n.recognizeImage( a1_3 ) );

tomado de aquí:https://habr.com/ru/sandbox/43916/

SZY: googleado, que no encontré sobre la marcha otras fuentes de la red Hamming, los enlaces a otras fuentes también son bienvenidos (no es net Hopfield!!! - google siempre les da juntos)

Igor, no creo que sea razonable escribir un deque, un vector será suficiente en la gran mayoría de los casos. He reestructurado tu ejemplo utilizando un vector del hilo sobre 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() );
}

No quiero meter la pata y estar seguro de que debería funcionar mal ))))

Para comprobarlo, he probado el código fuente y el código µl

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

en ambos casos obtuvo: 1 1 0 4294967295

HH: por cierto, parece que hay un error en la fuente - salirse de los límites de la matriz (el compañero se olvidó de añadir -1)

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

Igor, no creo que sea razonable escribir un deque, un vector es suficiente en la gran mayoría de los casos. He reestructurado tu ejemplo utilizando el vector del hilo sobre stl:

Para comprobarlo, he ejecutado en pluses código fuente y µl como

en ambos casos obtuvo: 1 1 0 4294967295

HH: por cierto, en el código fuente parecía ser un error - array overrun (camarada se olvidó de añadir -1)

¡О! ¡Eso fue muy rápido! ¡¡¡Gracias HUMAN!!!