Форум программистов, компьютерный форум CyberForum.ru

Умножение матриц и нахождение суммы элементов - C++

Восстановить пароль Регистрация
 
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 21:39     Умножение матриц и нахождение суммы элементов #1
надо умножить матрицу A на матрицу B, где матрица A размером m на n,
и найти в получившейся матрице сумму элементов строк и столбцов, на пересечении которых отрицательные элементы, помогите кто может, внизу наработки программы, единственное что надо это как определить эти элементы и сложить элементы срок и столбцов, пишу программу на xcode, так как другого компьютера нет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include <stdio.h>
using namespace std;
double ** AllocMatrix(int Rows, int Colomns)
{
    double ** Matrix;
    try
    {
        Matrix = new double * [Rows];
        if( Matrix == NULL ) throw 0;
        for (int i = 0; i < Rows; i++)
        {
            Matrix[i] = new double [Colomns];
            if( Matrix[i] == NULL ) throw i;
        }
    }
    catch( int index )
    {
        cout << "Error" << endl;
        for (int i = 0; i < index; i++)
        {
            delete [] Matrix[i];
            Matrix[i] = NULL;
        }
        return NULL;
    }
    return Matrix;
}
 
//vvod matrici
bool GetMatrix(double ***Matrix, int *Rows, int *Colomns)
{
    cout << "Rows: "; cin >> (*Rows);
    cout << "Colomns: "; cin >> (*Colomns);
    //Memory for massiv
    double **Ret;
    Ret = AllocMatrix(*Rows, *Colomns);
    *Matrix = Ret;
    if (Ret != NULL)
    {
        for (int i = 0; i < *Rows; i++)
            for (int j = 0; j < *Colomns; j++)
            {
                printf("Matrix[%d][%d] = ", i, j);
                cin >> Ret[i][j];
            }
        return true;
    }else return false;
}
//Razmernost
bool CheckMatrixes(int Rows1, int Colomns1, int Rows2, int Colomns2)
{
    return (Rows2 == Colomns1);
}
 
//Umnpzhenie matric
bool MultiplyMatrix(double **Matrix1, int Rows1, int Columns1,
                    double **Matrix2, int Rows2, int Columns2,
                    double ***ResultMatrix, int *ResultRows, int *ResultColumns)
{
    *ResultRows = Rows1;
    *ResultColumns = Columns2;
    double **Ret;
    Ret = AllocMatrix(*ResultRows, *ResultColumns);
    *ResultMatrix = Ret;
    if (Ret != NULL)
    {
        for (int i = 0; i < *ResultRows; i++)
            for (int j = 0; j < *ResultColumns; j++)
            {
                double Sum = 0;
                for (int n = 0; n < Rows2; n++)
                {
                    Sum += Matrix1[i][n]*Matrix2[n][j];
                }
                (*ResultMatrix)[i][j] = Sum;
            }
        return true;
    }else return false;
}
 
//Vivod matric
void MatrixOut(double **Matrix, int Rows, int Columns)
{
    for (int i = 0; i < Rows; i++)
    {
        for (int j = 0; j < Columns; j++)
            cout << Matrix[i][j] << "\t";
    }
}
 
 
//Osvobodit' pamyat
void FreeMatrix(double **Matrix, int Rows)
{
    for (int i = 0; i < Rows; i++)
    {
        
        delete [] Matrix[i];
        Matrix[i] = NULL;
    }
    delete [] Matrix;
    Matrix = NULL;
}
void MinusElementRows(double **Matrix, int Rows, int Columns, int minus[100])
{for (int i=0;i<Rows;i++)
 
    for (int j=0;j<Columns;j++)
        {
        if (Matrix[i][j]<0)
            (Matrix[i][j]) = minus[i]; i++;
        }
    }
void SumRows(int* minus, int i, int n, int sum )
{
    for (n=0, sum = 0; n<i; n++) sum+= minus[i];
    cout << sum;
}
int main()
{
    double ***A = new double **, ***B = new double **, ***C = new double **;
    int ARowCount, AColCount, BRowCount, BColCount, CRowCount, CColCount, *minus, i, n, sum;
    do
    {
        cout << "vvedite matricu A:\n";
    } while (!GetMatrix(A, &ARowCount, &AColCount));
    do
    {
        cout << "vvedite matricu B:\n";
    } while (!GetMatrix(B, &BRowCount, &BColCount));
    if (CheckMatrixes(ARowCount, AColCount, BRowCount, BColCount))
    {
        if (MultiplyMatrix(*A, ARowCount, AColCount,
                           *B, BRowCount, BColCount, C, &CRowCount, &CColCount))
        {
            cout << "result:\n";
            MatrixOut(*C, CRowCount, CColCount);
        }
    }else cout << "Nevozmozhno peremnozhit\n";
    
    cout << "otricatelnie elementi";
    MinusElementRows(*C, CRowCount, CColCount, minus);
    SumRows(minus, i, n, sum);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 21:41     Умножение матриц и нахождение суммы элементов #2
Элементарное задание, что именно не получается. И задание уточните


Цитата Сообщение от devilcry86 Посмотреть сообщение
умножение матриц и нахождение суммы элементов
умножение матриц на что? и суммы каких элементов?
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 21:43  [ТС]     Умножение матриц и нахождение суммы элементов #3
в первом сообщении написано задание, и там же написано что не получется
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 21:51     Умножение матриц и нахождение суммы элементов #4
Цитата Сообщение от devilcry86 Посмотреть сообщение
в первом сообщении написано задание, и там же написано что не получется
Странно, не заметил
C++
1
2
3
4
5
6
7
8
for (i=0;i<k;i++) 
    for (j=0;j<n;j++)
    { 
        c[i][j]=0; //обнуляем элемент,  в который будет производится запись перемножения строка на                      
              //столбец
        for (z=0;z<m;z++)
            c[i][j]+=a[i][z]*b[z][j]; //записываем сумму  умножая поочередно элементы строки и столбца 
    }
Добавлено через 1 минуту
Только смотрите, чтобы размер соответствовал правилу.
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 21:57  [ТС]     Умножение матриц и нахождение суммы элементов #5
а как в двумерном массиве определить отрицательный элемент и потом номер строки и столбца передать в функцию суммы их элементов???
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 22:12     Умножение матриц и нахождение суммы элементов #6
Цитата Сообщение от devilcry86 Посмотреть сообщение
а как в двумерном массиве определить отрицательный элемент и потом номер строки и столбца передать в функцию суммы их элементов???
два цикла, в них условие
C
1
if ( arr[i][j] < 0 )
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
28.12.2011, 22:50  [ТС]     Умножение матриц и нахождение суммы элементов #7
то есть мне надо зациклить условие, а в условие поставить ещё циклы которые будут считать сумму?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.12.2011, 22:54     Умножение матриц и нахождение суммы элементов #8
Цитата Сообщение от devilcry86 Посмотреть сообщение
то есть мне надо зациклить условие, а в условие поставить ещё циклы которые будут считать сумму?
Да, но лучше, чтобы не было большое вложенности, в условии вызывать функцию подсчета суммы
например, вот прототип, опишете ее сами
C
1
int sum (int **arr, int row, int column);
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
29.12.2011, 11:24  [ТС]     Умножение матриц и нахождение суммы элементов #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int** Sum(double **Matrix, int Rows, int Columns, int i, int j, int k, int n, int z, int m, double **c, int **a, int **b, double result)
{for (i=0;i<k;i++) 
    for (j=0;j<n;j++)
    { 
    c[i][j]=0; //обнуляем элемент,  в который будет производится запись перемножения строка на                      
        //столбец
        for (z=0;z<m;z++)
            c[i][j]+=a[i][z]*b[z][j]; //записываем сумму  умножая поочередно элементы строки и столбца 
     }
    c[i][j] = result;
}
 
 
int vivod (int **c, int Rows, int Columns, int k, int n, int i, int j, int z, int m, double ***vivodmatrix, double** ret, int **Matrix, int **a, int **b)
{for (i=0;i<k;i++) 
    for (j=0;j<n;j++)
    {if ( c[Rows][Columns] < 0 )
        ret = Sum(*Matrix, Rows, Columns, k,n,i,j,z,m,  *c, *a, *b );
        *vivodmatrix = ret;
        }
}
подскажите как корректно все это дело увязать между собой, а то в этом вообще ноль, но работу надо сделать

Добавлено через 36 минут
ребят подскажите пожалуйста, очень надо...

Добавлено через 10 часов 45 минут
в 11 строке компилятор выдает предупреждение control reqches end of non-void function, а в 18 выдает ошибку not matching found function to call Sum
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 11:28     Умножение матриц и нахождение суммы элементов #10
Исходя из Ваших функций:
- Функция sum должна вернуть int **
- Переменная ret должна иметь тип int **
devilcry86
0 / 0 / 0
Регистрация: 28.12.2011
Сообщений: 6
29.12.2011, 12:11  [ТС]     Умножение матриц и нахождение суммы элементов #11
какое именно значение она должна возвращать, и все же компилятор ругается что не может найти функцию

Добавлено через 21 минуту
вписываю эти функции в тело программы, мне выдает ошибку что они не найдены, как с этим бороться?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2011, 16:24     Умножение матриц и нахождение суммы элементов
Еще ссылки по теме:

C++ Нахождение в матрице суммы парных элементов
C++ Нахождение суммы элементов строки
C++ Нахождение суммы всех элементов массива и суммы первых 3-х элементов массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 16:24     Умножение матриц и нахождение суммы элементов #12
devilcry86, правильно описать функцию.
Yandex
Объявления
29.12.2011, 16:24     Умножение матриц и нахождение суммы элементов
Ответ Создать тему
Опции темы

Текущее время: 09:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru