Perguntas sobre a linguagem SI - página 11

 
TheXpert:

ponteiro para um pedaço de dados de tamanho 4 ou 8 bytes.

O tamanho depende da plataforma por causa do alinhamento. Se você usar algo como pragma pack 1, o tamanho será o mesmo (1 byte provavelmente)

Às vezes eu também procuro no VS C++, compilar em modo de listagem porsm e depois olho para ele, muita coisa fica clara. Sim, parece assustador, mas o asm é a verdade absoluta em último recurso. E a linguagem não é difícil de entender. É difícil escrevê-lo corretamente))

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

Sim, obrigado... como eles dizem, eu sabia mas esqueci, pois não sou programador e raramente o faço :)

 

Quero portar este código fonte para a MQL, mas não tenho certeza se posso lidar com 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] );
}


retirado daqui:https://habr.com/ru/sandbox/43916/

SZZY: pesquisado no Google e não encontrei nenhum outro código fonte Hamming, links para outras fontes são bem-vindos (não a rede Hopfield!!! - o google sempre os dá juntos)

 
Igor Makanu:

Quero portar este código fonte para a MQL, mas não tenho certeza se posso lidar com std::deque.

é uma lista bidirecional. o código acima só tem push_back, então é possível que você possa substituí-lo por um vetor.

se não, você pode fazer uma simples implementação de deque via array com uma reserva desde o início e fim. em STL é de alguma forma implementado dessa forma.

 
Andrei Trukhanovich:

esta é uma lista bidirecional. no código acima só existe o push_back, portanto há uma chance de que ele possa ser substituído por um vetor.

Caso contrário, você pode fazer uma simples implementação de deque através de matriz com redundância inicial e final.

Eu pesquisei std::deque e é como você escreve, mas... Não sei como usá-lo e apenas substituí-lo por um vetor... Em geral, o exemplo é um tutorial, eu não gostaria de fazer asneira e ter certeza de que é assim que deve funcionar mal ))))

ZS: Há também um exemplo em F# - mas eu acho que é demais ;)

 
Igor Makanu:

Quero portar este código fonte para MQL, mas não tenho certeza se posso lidar com std::Alert( n.recognImage( a1_3 ) );

retirado daqui:https://habr.com/ru/sandbox/43916/

SZY: Google, que eu não encontrei em tempo real outras fontes da rede Hamming, links para outras fontes também são bem-vindos (não é rede Hopfield!!! - google sempre os dá juntos)

Igor, eu não acho razoável escrever um deque, um vetor será suficiente na grande maioria dos casos. Eu reescrevi seu exemplo usando um vetor da linha 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() );
}

Não quero estragar tudo e ter certeza de que deve funcionar de forma imprópria ))))

Para verificar isso, eu testei o código fonte e o µl code

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

em ambos os casos obteve: 1 1 0 4294967295

HH: a propósito, parecia haver um erro na fonte - ir além dos limites da matriz (o camarada esqueceu de acrescentar -1)

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

Igor, eu não acho que seja razoável escrever um deque, um vetor é suficiente na grande maioria dos casos. Eu reescrevi seu exemplo usando o vetor da linha sobre stl:

Para verificar, eu executei com fonte plus e código µl como

em ambos os casos obteve: 1 1 0 4294967295

HH: a propósito, no código fonte pareceu ser um erro - overrun array (o camarada esqueceu de adicionar -1)

О! Isso foi tão rápido! Obrigado HUMAN!!!

Razão: