Транспонирование и умножение матриц.

Тема в разделе "C/C++/C#", создана пользователем aaaaaa, 30 июн 2011.

  1. aaaaaa

    aaaaaa Гость

    Дана квадратная матрица А порядка n. Получить вектор А(T)b;
    Элементы вектора b вычисляются по формуле: b(i)=1(i^2+2), при i-четное, b(i)=1/i , при i-нечетное.
    Определить функции транспонирования квадратной матрицы и умножения квадратной матрицы на вектор.
    Разместить определение данных в заголовочном файле, а определения функций и главную функцию программы в двух отдельных файлах.

    Программа крашится после транспонирования, Помогите найти в ошибку, пожалуйста,и , лучше, с обьяснениями. Заранее спасибо

    main.cpp:
    Код (C++):
    #include <iostream>
    #include <conio.h>
    #include <string.h>
    #include "functions.h"



    using namespace std;

    int main()
    {
    int n;
    cout << " Enter n:";
    cin >> n;

    int** mtrx = newmatrix(n);

    for(int i = 0; i < n; ++i)
    {
    for (int j=0; j<n; j++)
    {
    mtrx[i][j] = j;
    }
    }

    for(int i = 0; i < n; ++i)
    {
    for (int j=0; j<n; j++)
    {
    printf ("%3i",mtrx[i][j]);
    }
    cout << endl;
    }
    cout << endl;
    int** tmtrx = Transposition(mtrx, n);

    for(int i = 0; i < n; ++i)
    {
    for (int j=0; j<n; j++)
    {
    printf ("%3i",tmtrx[i][j]);
    }
    cout << endl;
    }

    int** vec=newvector(n);

    Fillvec(vec, n);

    int **res=newvector(n);

    Calculations (tmtrx, vec, res,n);

    for (int i=0; i<n; i++)
    {
    cout << res[i];
    }

    cleanmem(mtrx, n);
    cleanmem(tmtrx, n);
    cleanmem(vec, n);
    return 0;
    }
    functions.h:
    Код (C++):
    #ifndef FUNCTIONS_H_INCLUDED
    #define FUNCTIONS_H_INCLUDED

    int** newmatrix(const int n);

    int** Transposition(int** matrix,const int n);

    void cleanmem(int** array, const int n);

    int** newvector(const int n);

    void Fillvec(int** vector,const int n);

    void Calculations (int** transmax, int** vector, int** results, const int n);

    #endif // FUNCTIONS_H_INCLUDED
    functions.cpp:

    Код (C++):
    #include <iostream>
    #include <conio.h>
    #include "functions.h"

    using namespace std;

    int** newmatrix(const int n)
    {
    int** array = new int*[n];
    for(int i = 0; i < n; ++i)
    {
    array[i] = new int[n];
    }
    return array;
    }

    //-------------------------------

    int** newvector(const int n)
    {
    int** vector=new int*[n];
    return vector;
    }

    void Fillvec(int** vector,const int n)
    {
    for (int i=0; i<n; i++)
    {
    if (i%2==0)
    {
    *vector[i]=(1/i);
    }
    else
    {
    *vector[i]=(1/(i*i+2));
    }
    }
    }

    //---------------
    void cleanmem(int** array, const int n)
    {
    for(int i = 0; i < n; ++i)
    {
    delete[] array[i];
    }
    delete[] array;
    }

    //---------------

    int** Transposition(int** matrix, const int n)
    {
    int** transmatx = newmatrix(n);

    for(int i = 0; i < n; ++i)
    {
    for(int j = 0; j < n; ++j)
    {
    transmatx[j][i] = matrix[i][j];
    }

    }
    return transmatx;
    }


    //-------------------------

    void Calculations (int** transmatx, int** vector, int** results, const int n)
    {
    int sum;
    for (int i=0; i<n; i++)
    {
    for (int j=0; j<n; j++)
    {
    sum+=(transmatx[i][j]+*vector[j]);
    }
    *results[i]=sum;
    }
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А как это ты так вектор интересно заполняешь? И почему у тебя вектор имеет размерность два? Это же вектор! Он должен быть одномерным.
     
  3. aaaaaa

    aaaaaa Гость

    Я честно говоря запутался в этих указателях уже . :lool:
    Тогда, наверное, должно быть так. Но что-то все равно она крашится после транспонирования. Похоже я чего-то не понимаю. Напишите хотя-бы примерно, как это должно быть, пожалуйста.

    main.cpp

    Код (C++):
    #include <iostream>
    #include <conio.h>
    #include <string.h>
    #include "functions.h"



    using namespace std;

    int main()
    {
    int n;
    cout << " Enter n:";
    cin >> n;

    int** mtrx = newmatrix(n);

    for(int i = 0; i < n; ++i)
    {
    for (int j=0; j<n; j++)
    {
    mtrx[i][j] = j;
    }
    }

    for(int i = 0; i < n; ++i)
    {
    for (int j=0; j<n; j++)
    {
    printf ("%3i",mtrx[i][j]);
    }
    cout << endl;
    }
    cout << endl;
    int** tmtrx = Transposition(mtrx, n);

    for(int i = 0; i < n; ++i)
    {
    for (int j=0; j<n; j++)
    {
    printf ("%3i",tmtrx[i][j]);
    }
    cout << endl;
    }
    cout<< endl;

    int* vec=newvector(n);

    Fillvec(vec, n);

    for (int i=0; i<n; i++)
    {
    cout << vec[i];
    }
    cout << endl;

    int *res=newvector(n);

    Calculations (tmtrx, vec, res,n);

    for (int i=0; i<n; i++)
    {
    cout << res[i];
    }

    cleanmem(mtrx, n);
    cleanmem(tmtrx, n);
    cleanmem2(vec, n);
    cleanmem2 (res, n);
    return 0;
    }

    functions.cpp:
    Код (C++):
    #include <iostream>
    #include <conio.h>
    #include "functions.h"

    using namespace std;

    int** newmatrix(const int n)
    {
    int** array = new int*[n];
    for(int i = 0; i < n; ++i)
    {
    array[i] = new int[n];
    }
    return array;
    }

    //-------------------------------

    int* newvector(const int n)
    {
    int* vector=new int [n];
    return vector;
    }

    void Fillvec(int* vector,const int n)
    {
    for (int i=0; i<n; i++)
    {
    if (i%2==0)
    {
    vector[i]=(1/i);
    }
    else
    {
    vector[i]=(1/(i*i+2));
    }
    }
    }

    //---------------
    void cleanmem(int** array, const int n)
    {
    for(int i = 0; i < n; ++i)
    {
    delete[] array[i];
    }
    delete[] array;
    }

    void cleanmem2(int* array, const int n)
    {
    delete[] array;
    }

    //---------------

    int** Transposition(int** matrix, const int n)
    {
    int** transmatx = newmatrix(n);

    for(int i = 0; i < n; ++i)
    {
    for(int j = 0; j < n; ++j)
    {
    transmatx[j][i] = matrix[i][j];
    }

    }
    return transmatx;
    }


    //-------------------------

    void Calculations (int** transmatx, int* vector, int* results, const int n)
    {
    int sum;
    for (int i=0; i<n; i++)
    {
    for (int j=0; j<n; j++)
    {
    sum+=(transmatx[i][j]+vector[j]);
    }
    results[i]=sum;
    }
    }

    //----------------
    functions.h:

    Код (C++):
    ifndef FUNCTIONS_H_INCLUDED
    #define FUNCTIONS_H_INCLUDED

    int** newmatrix(const int n);

    int** Transposition(int** matrix,const int n);

    void cleanmem(int** array, const int n);

    void cleanmem2(int* array, const int n);

    int* newvector(const int n);

    void Fillvec(int* vector,const int n);

    void Calculations (int** transmax, int* vector, int* results, const int n);

    #endif // FUNCTIONS_H_INCLUDED
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Поправь в Calculations: изначально sum = 0; но крашится не из-за этого, а из-за того что...

    vector=(1/i);

    ...на ноль обычно никто не делит.

    P.S.: 0%2==0 <--- истина!
     
  5. aaaaaa

    aaaaaa Гость

    Спасибо огромное, не заметил. :lool:

    Кстати, если можно, удалите пожалуйста тему. ;)
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Зачем?) Пусть будет:lool:
     
Загрузка...
Похожие Темы - Транспонирование умножение матриц
  1. student22rus
    Ответов:
    1
    Просмотров:
    2.456

Поделиться этой страницей