Вопросы по языку СИ - страница 11

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Volchanskiy
27142
Alexey Volchanskiy  
TheXpert:

указатель на кусок данных размеров в 4 или 8 байт.

размер зависит от платформы из-за выравнивания. если использовать что-нибудь типа pragma pack 1 то размер будет одинаковый (1 байт наверное)

Я еще иногда смотрю в VS C++, компилируешь в режиме листинга на asm и потом его смотришь, многое становиться ясным. Да, звучит страшненько, но asm - это чистая правда в последней инстанции. И язык не сложный для понимания. Сложно писать на нем грамотно)) 

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

да, спасибо.. как говорится знал но забыл, т.к. не программист и редко этим занимаюсь :)

Igor Makanu
8676
Igor Makanu  

если кто располагает временем и знанием, хотелось бы получить помощь, хочу этот исходник портировать на MQL, но не уверен, что справлюсь с 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.95f/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.5f*(axons[i]+float(n) ) );
        }
                
        while( sum2 != sum1 )        // цикл пока выходы сети изменяются
        {   sum1 = 0.0f * ( sum2 = sum1 );
            for(i=0; i < w.size(); ++i)
                sum1 += axons[i] = activation( axons[i]-e*(sum2-axons[i]) );
        }
        for(i=w.size(); i!=-1u && !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] );
}


взят отсюда: https://habr.com/ru/sandbox/43916/

ЗЫ: прогуглил, что то не нашел сходу других исходников сети Хэмминга ,  ссылки на другие исходники тож приветствуются   ( это не сети Хопфилда!!!- гугл их вместе постоянно выдает  )

Andrei Trukhanovich
13686
Andrei Trukhanovich  
Igor Makanu:

если кто располагает временем и знанием, хотелось бы получить помощь, хочу этот исходник портировать на MQL, но не уверен, что справлюсь с std::deque

это двунаправленный список. в приведенном коде есть только push_back так что есть шанс что можно заменить на вектор.

если нет, можно сделать несложную реализацию deque через массив с запасом с начала и конца. в STL как-то так вроде и реализовано.

Igor Makanu
8676
Igor Makanu  
Andrei Trukhanovich:

это двунаправленный список. в приведенном коде есть только push_back так что есть шанс что можно заменить на вектор.

если нет, можно сделать несложную реализацию deque через массив с запасом с начала и конца. в STL как-то так вроде и реализовано.

я гуглил про std::deque , так и есть как Вы пишете, но... я не умею им пользоваться, а просто заменить на вектор... в общем пример учебный, не хотелось бы накосячить и быть уверенным, что так и должно все криво работать )))

ЗЫ: есть еще пример на F# - но по моему это уже перебор ;)

Vict
545
Vict  
Igor Makanu:

если кто располагает временем и знанием, хотелось бы получить помощь, хочу этот исходник портировать на MQL, но не уверен, что справлюсь с std::Alert( n.recognizeImage( a1_3 ) );

взят отсюда: https://habr.com/ru/sandbox/43916/

ЗЫ: прогуглил, что то не нашел сходу других исходников сети Хэмминга ,  ссылки на другие исходники тож приветствуются   ( это не сети Хопфилда!!!- гугл их вместе постоянно выдает  )

Игорь, писать deque считаю нецелесообразным, вектора хватить в подавляющем большинстве случаев. Переписал ваш пример с использованием вектора из темы про стл:

#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.95f/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.5f*(axons.a[i]+float(n) ) );
        }
                
        while( sum2 != sum1 ) {       // цикл пока выходы сети изменяются
            sum1 = 0.0f * ( 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() );
}

не хотелось бы накосячить и быть уверенным, что так и должно все криво работать )))

Для проверки прогнал на плюсах исходник и мкл код вида

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

в обоих случаях получил: 1  1  0  4294967295

ЗЫ: кстати, в исходник вроде ошибка была - выход за границы массива (товарищ забыл добавить -1)

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

Игорь, писать deque считаю нецелесообразным, вектора хватить в подавляющем большинстве случаев. Переписал ваш пример с использованием вектора из темы про стл:

Для проверки прогнал на плюсах исходник и мкл код вида

в обоих случаях получил: 1  1  0  4294967295

ЗЫ: кстати, в исходник вроде ошибка была - выход за границы массива (товарищ забыл добавить -1)

О! Так быстро! Спасибо ЧЕЛОВЕЧИЩЕ!!!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий