Перемножение матриц...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by VERte][, 5 Nov 2007.

  1. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Пока разбирался с указателями с посыла inv, написал вот такую весчь, может кому пригодится:

    Code:
    #include<iostream>
    using namespace std;
    
    typedef int* pint;
    void fillarray(pint array[], int m, int n);
    void result(pint a[], pint b[], int m, int k ,int n);
    
    int main()
    {
        int m,n,k;
        char exit;
        cout<<"Input 1st array size: "<<endl<<"m: ";
        cin>>m; cout<<"n: "; cin>>k;
        cout<<"Input 2nd array size: "<<endl<<"m: "<<k<<endl<<"n: ";
        cin>>n;
    
        pint *p=new pint[m],*q=new pint[k];
        for (int i=0;i<m;i++)
        p[i]=new int[k];
    
        for (int i=0;i<k;i++)
        q[i]=new int[n];
    
        fillarray(p, m,k);
        fillarray(q, k,n);
    
        result(p,q,m,k,n);
    
        for (int i=0;i<k;i++)
        delete p[i];
    
        for (int i=0;i<n;i++)
        delete q[i];
    
    delete[] p, q;
    
    cout<<"Input any key to quit: ";
    cin>>exit;
    return 0;
    }
    
    
    void fillarray(pint array[], int m, int n)
    {
        cout<<"Input "<<m<<"x"<<n<<" array: "<<endl;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            cin>>array[i][j];
    }
    
    void result(pint a[], pint b[], int m, int k, int n)
    {
        int sum(0);
        cout<<"Result "<<m<<"x"<<n<<" array:"<<endl;
    
        for(int i=0; i<m; i++)
          for(int j=0; j<n; j++)
            {
                for(int h=0; h<k ;h++)
                {
                    sum=sum+a[i][h]*b[h][j];
                }
                cout<<sum<<" ";
                sum=0;
                if (j==n-1) cout<<endl;
    
            }
    }
    прога перемножает 2 матрицы произволных размеров и выводит результат на экран (в отдельный массив забивать результат не стал ибо память и лень :) )
     
    4 people like this.
  2. vp$

    vp$ Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    65
    Likes Received:
    68
    Reputations:
    19
    зачем изобретать велосипед, насколько я помню , в экселе это стандартная функция))
     
  3. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    так он же вроде ясно написал "Пока разбирался с указателям..."
    в экселе это будет посложней:d (разбираться с указателями)
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Ну блин, давайте теперь все свои лабы вываливать...
     
  5. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    Сделайте раздел для подобных случаев...че париться-то
     
  6. ~Lexx~

    ~Lexx~ Elder - Старейшина

    Joined:
    30 Sep 2006
    Messages:
    195
    Likes Received:
    28
    Reputations:
    0
    Во первых - резон от такой проги, которая только выводит на экран рассчеты. Во вторых Это голый метод - никакой оптимизации. Это может написать каждый - пользы от него никакой.

    Ладно сегодня завтра напишу немного по теории численных методов - чтобы не писали в лоб, а хотя бы немного оптимизировали.
     
  7. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Давай, буду признателен
     
  8. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    437
    Reputations:
    90
    есть такая софтина как mathlab(вроде), она считает енто
     
  9. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    я ж написал, что делал это с целью освоения указателей, не более, вдруг тоже кто-то будет с этим разбираться, а у меня как раз рассмотрены случаи динамических массивов и указатели, как параметры ф-ции...
     
  10. ~Lexx~

    ~Lexx~ Elder - Старейшина

    Joined:
    30 Sep 2006
    Messages:
    195
    Likes Received:
    28
    Reputations:
    0
    Ну простите если матлаб это софтина))) матлаб это среда математического моделирования - очень мощная, и гибкая. Но Весит гиг (новая версия) и в нее еще надо врубиться. А перемножать матрицы проще конечно в экселе), да вот только куда приятнее самому написать метод, только толковый.
     
  11. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Мне кажется, лучше подредактировать тему, закрепить и выкладывать в ней сорцы реализаций стандартных структур данных(либо ссылки на сорцы). Просто такого вроде бы нету на ачате, а например тоже самое перемножение матриц отлично бы смотрелось как перегрузка оператора * в специальном классе матрицы.
     
  12. Серенький

    Joined:
    13 Apr 2007
    Messages:
    112
    Likes Received:
    145
    Reputations:
    83
    Для того, чтобы в матлабе перемножить две матрицы, особо и врубаться не нужно. А хелп все остальные вопросы лечит.
     
  13. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    вот небольшая поправка: запись результата в отдельный двумерный массив и последующий вывод результатов из него

    Code:
    #include<iostream>
    using namespace std;
    
    typedef int* pint;
    void fillarray(pint array[], int m, int n);
    pint* result(pint a[], pint b[], int m, int k ,int n);
    void output(pint array[], int m, int n);
    
    int main()
    {
        int m,n,k;
        char exit;
        cout<<"Input 1st array size: "<<endl<<"m: ";
        cin>>m; cout<<"n: "; cin>>k;
        cout<<"Input 2nd array size: "<<endl<<"m: "<<k<<endl<<"n: ";
        cin>>n;
    
        pint *p=new pint[m],*q=new pint[k], *res;
    
        fillarray(p, m,k);
        fillarray(q, k,n);
        res=result(p,q,m,k,n);
        output(res,m,n);
    
    
    cout<<"Input any key to quit: ";
    cin>>exit;
    return 0;
    }
    
    
    void fillarray(pint array[], int m, int n)
    {
        for (int i=0;i<m;i++)
        array[i]=new int[n];
    
        cout<<"Input "<<m<<"x"<<n<<" array: "<<endl;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            cin>>array[i][j];
    }
    
    pint* result(pint a[], pint b[], int m, int k, int n)
    {
        int sum(0);
        pint *temp = new pint[m];
        for (int i=0;i<m;i++)
        temp[i]=new int[n];
    
        for(int i=0;i<m;i++)
          for(int j=0;j<n;j++)
            temp[i][j]=0;
    
    
    
        for(int i=0; i<m; i++)
          for(int j=0; j<n; j++)
            {
                sum=0;
                for(int h=0; h<k ;h++)
                {
                    sum=sum+a[i][h]*b[h][j];
                }
                 temp[i][j]=sum;
            }
        return temp;
    
        for (int i=0;i<k;i++)
        delete a[i];
    
        for (int i=0;i<n;i++)
        delete b[i];
    
        delete[] a, b;
    }
    
    void output(pint array[], int m, int n)
    {
        cout<<"Result "<<m<<"x"<<n<<" array:"<<endl;
        for (int i=0;i<m;i++)
         for (int j=0;j<n;j++)
          {
              cout<<array[i][j]<<" ";
              if (j==n-1) cout<<endl;
          }
         for (int i=0;i<n;i++)
         delete array[i];
        delete[] array;
    }
     
  14. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Уже не первый раз вижу подобное, поэтому решил написать.
    Код:
    Code:
    for(int i=0; i<m; i++)
          for(int j=0; j<n; j++)
            {
                sum=0;
                for(int h=0; h<k ;h++)
                {
                    sum=sum+a[i][h]*b[h][j];
                }
                 temp[i][j]=sum;
            }
    
    Зачем объявлять доп. переменную sum? Не проще ли сделать так:
    Code:
    for(int i=0; i<m; i++)
          for(int j=0; j<n; j++)
            {
                temp[i][j] = a[i][0]*b[0][j];
                for(int h=1; h<k ;h++)
                {
                    temp[i][j] += a[i][h]*b[h][j];
                }
            }
    
    И еще по тексту: понимаю что прога маленькая и простенькая, но тем не менее - комментарий вообще нету, обработка исключительных ситуаций тоже отсутствует. Зачем в функции result после return какой-то текст? Он что, когда-то выполняться будет?Переменная exit тоже впринципе не нужна - символ можно поместить и в любую другую переменную, какая разница как он будет храниться? И еще: если хочешь разобраться с указателями, то я бы лично не использовал typedef и конструкции вида array заменял бы на *(*(array+i)+j) и использовал бы по максимуму арифметику с указателями. Через некоторое время(впринципе непродолжительное :) ) приходит понимание и привыкаешь к указателям. Мое имхо :).
     
    1 person likes this.
  15. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    справедливо, буду учится =) я ж ток начинаю
     
  16. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    А вот ещё проще, зачем надо было ставить строчку temp[j] = a[0]*b[0][j]; ?
    можно вот так:

    Code:
    for(int i=0; i<m; i++)
          for(int j=0; j<n; j++)
                 for(int h=0; h<k ;h++)
                    temp[i][j] += a[i][h]*b[h][j];
    
     
  17. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Vertexe
    По адресу temp[j] изначально находтися неинициализированное значение. Т.е. совершенно случайное число. Дальше по коду ты предлагаешь прибавлять к этому числу произведения соответствующих элементов. Это неправильно. Нам нужно чтобы там стоял 0, либо произведение первых двух элементов, как и было реализовано в моем сорце.
     
  18. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    заметь что в коде у меня идёт сначала обнуление массива temp!!!
     
  19. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Признаюсь, не заметил. =) Но, мне кажется его лучше убрать. В нем нет необходимости. Когда обнуляешь - прогоняешь цикл лишний раз по всем элементам. Это не рационально. Получается огромная потеря по производительности. Раза в 2-а наверное.
     
  20. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Тоже верно...