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

Произведение матриц - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
qwe12355
7 / 7 / 0
Регистрация: 26.11.2011
Сообщений: 117
22.04.2012, 14:35     Произведение матриц #1
Вобщем вот задача:"Напишите перегружаемую функцию product, которая возвращает произведение вещественных квадратных матриц либо комплексных чисел.

Комплексные числа представлены в виде структуры из двух вещественных чисел.

Продемонстрируйте работу функции для всех вариантов данных."
застопорился с матрицами, вродебы цикла для перебора матриц правильные (ведь да?), но выдает какую-то ошибку я так и не понял что за оно.

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
#include <iostream.h>
 
struct complex
{
    double real;
    double imaginary;
};
 
complex product(complex &x, complex &y)
{
    complex z;
    z.real=x.real*y.real - x.imaginary*y.imaginary;
    z.imaginary=x.real*y.imaginary+y.real*x.imaginary;
    return z;
}
 
float **product(float *a,float *b,int size)
{
    float **n = new float*[size];//dinamical array for save data
        for (int k = 0; k<size; k++)
            n[k] = new float[size];
 
    float temp;
    int count;
    for(int i=0;i<size;i++)
    {
            for(int j=0; j<size; j++)
            {
 
                for(int d=0;d<size;d++)
                {
                    temp+=a[i][d]*b[d][j];\\здесь пишет subscript requires array or pointer type
                }
 
                n[i][j]=temp;
            }
            
    }
 
 
 
 
    return n;
 
 
}
 
 
 
void main()
{
complex u,w,c;
u.real=2.0;
u.imaginary=-5.0;
w.real=3.0;
w.imaginary=2.0;
c=product(u,w);
cout<<"Real part = "<<c.real<<", imaginary part = "<<c.imaginary<<endl;
int f[2][2]={{1,2},{4,5}};
cout<<f[0][0]<<f[0][1];
 
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21427 / 10212 / 1664
Регистрация: 12.02.2012
Сообщений: 17,082
22.04.2012, 14:47     Произведение матриц #2
1. Поскольку в заголовке метода указано float *a, то a требует одного индекса. Нужно задавать
float **a
2. Переменную temp перед суммированием нужно чистить
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
22.04.2012, 14:57     Произведение матриц #3
ну в общем-то основная проблема в том , что в функцию передаются два одномерных массива (вектора) , а Вы хотите их перемножить как двумерные массивы (матрицы) . а в переменной temp изначально хранится мусор , поэтому если к ней прибавить что-то , то все равно будет мусор )
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.04.2012, 14:57     Произведение матриц #4
Catstail прав. Либо, как вариант, можно перенести обьявление temp в строку №29, тогда после 1 прохода цикла по j старая пременная temp уничтожится, а при при следующем проходе создастся новая temp=0.
Да, и dota тоже прав, потому лучше обьявлять
int temp=0;
qwe12355
7 / 7 / 0
Регистрация: 26.11.2011
Сообщений: 117
22.04.2012, 14:59  [ТС]     Произведение матриц #5
спасибо, при компиляции ошибки исчезли.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
float **product(float **a,float **b,int size)
{
    float **n = new float*[size];//dinamical array for save data
        for (int k = 0; k<size; k++)
            n[k] = new float[size];
 
    float temp;
    for(int i=0;i<size;i++)
    {
            for(int j=0; j<size; j++)
            {
                temp=0;
 
                for(int d=0;d<size;d++)
                {
                    temp+=a[i][d]*b[d][j];
                }
 
                n[i][j]=temp;
            }
            
    }
но теперь я не знаю как мой массив n использовать в программе
C++
1
2
3
4
5
           float f[2][2]={{1,2},{4,5}};
    cout<<f[0][0]<<f[0][1];
    float **arr;
    float a[2][2]={{1,2},{3,4}};
    arr=product(f[2][2],a[2][2],2);//'product' : none of the 2 overloads can convert parameter 1 from type 'float'
так я написал в main и мне выдал ошибку компилятор
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
22.04.2012, 15:54     Произведение матриц #6
arr=product(f[2][2],a[2][2],2);//'product' : none of the 2 overloads can convert parameter 1 from type 'float'
f[2][2] - это обращение к 3-му эл-ту в 3-ей строке f, у вас под него даже память не выделена). тип f[2][2] - float; тип параметра функции - float * * - из-за этого и ошибка.
qwe12355
7 / 7 / 0
Регистрация: 26.11.2011
Сообщений: 117
22.04.2012, 17:28  [ТС]     Произведение матриц #7
а ну да, тогда пробую

C++
1
2
3
4
5
6
7
8
9
float f[2][2]={{1,2},{3,4}};
    float a[2][2]={{1,2},{3,4}};
    cout<<f[0][0]<<f[0][1];
    float **arr;
    float (*pf)[2][2];
    pf=&f;
    float (*pa)[2][2];
    pa=&a;
    arr=product(pf,pa,2);//ругается none of the 2 overloads can convert parameter 1 from type 'float (*)[2][2]
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
22.04.2012, 18:22     Произведение матриц #8
Не совсем понятно , что вы делаете в строчках 5 и 7 , ведь можно исходные массивы и так передать в функцию.Попробуйте так :
C++
1
2
3
4
float f[2][2]={{1,2},{3,4}};
    float a[2][2]={{1,2},{3,4}};
    cout<<f[0][0]<<f[0][1];
    float **arr = product(f,a,2);
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
22.04.2012, 19:09     Произведение матриц #9
none of the 2 overloads can convert parameter 1 from type 'float (*)[2][2]
Читайте же что пишет компилятор. Зачем передаёте указатель на двумерный массив? Ведь тип параметра фукции float * *, так и передавайте аргумент того же типа.
qwe12355
7 / 7 / 0
Регистрация: 26.11.2011
Сообщений: 117
22.04.2012, 21:28  [ТС]     Произведение матриц #10
dota, я то согласен что можно, только компилятор не хочет так.

gray_fox, не мог ли бы вы тогда подсказать как именно мне передавать?

Добавлено через 11 минут
или в функции что-то подправить?
dota
3 / 3 / 0
Регистрация: 20.09.2010
Сообщений: 100
22.04.2012, 22:38     Произведение матриц #11
стоп , так Ваша же функция произведения матриц вообще ничего не возвращает ! по всей видимости , в этом и проблема .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2012, 02:10     Произведение матриц
Еще ссылки по теме:

Найти произведение матриц C++
C++ Найти произведение матриц

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.04.2012, 02:10     Произведение матриц #12
Так компилируется.
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
#include <stdlib.h>
#include <stdio.h>
 
 
static int const size            = 2;
 
 
float ** product(float a[size][size], float b[size][size])
{
    float **n = new float*[size];//dinamical array for save data
        for (int k = 0; k<size; k++)
            n[k] = new float[size];
 
    float temp;
    for(int i=0;i<size;i++)
    {
            for(int j=0; j<size; j++)
            {
                temp=0;
 
                for(int d=0;d<size;d++)
                {
                    temp+=a[i][d]*b[d][j];
                }
 
                n[i][j]=temp;
            }
            
    }
    
    return n;
}
 
 
int main() {
    float f[size][size]= {{1., 2.}, {4., 5.}};
    float a[size][size] ={{1, 2}, {3, 4}};
    int i, j;
       
    float ** prod = product(f, a);
    
    for (i = 0; i != size; ++i) {
        for (j = 0; j != size; ++j) {
            printf("%f ", prod[i][j]);
        }
        printf("\n");
    }
    
    for (i = 0; i != size; ++i) {
        delete[] prod[i];
    }
    delete[] prod;
        
    return EXIT_SUCCESS;
}
Алгоритм не проверял.
Yandex
Объявления
23.04.2012, 02:10     Произведение матриц
Ответ Создать тему
Опции темы

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