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

Перемножение матриц - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
09.05.2014, 22:07     Перемножение матриц #1
Доброго времени суток!
У меня есть две матрицы: первая k x m и вторая u x s размерностей. Нужно их перемножить. Подскажите, пожалуйста, в чем ошибка?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float** Mult(float **mas1, float **mas2, float **mul, int k, int m, int s)
{
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < s; j++)
        {
            for (int v = 0; v < m; v++)
            {
                mul[i][j] += round((mas1[i][v] * mas2[v][j])*1000.0)/1000.0;
            }
        }
    }
 
    return mul;
}
Добавлено через 43 минуты
У меня выходит, что у обоих матриц счетчики i, j, может в этом проблемма?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 22:07     Перемножение матриц
Посмотрите здесь:

C++ Перемножение матриц
Перемножение 2-ух матриц C++
Перемножение матриц. C++
Перемножение матриц C++
C++ Перемножение матриц
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,478
09.05.2014, 22:53     Перемножение матриц #2
А почему не обнуляешь mul[i][j] предварительно? И зачем это умножение на 1000? Округлять тоже лучше после вычисления.
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,912
09.05.2014, 22:55     Перемножение матриц #3
Цитата Сообщение от Donville Посмотреть сообщение
У меня есть две матрицы: первая k x m и вторая u x s размерностей. Нужно их перемножить. Подскажите, пожалуйста, в чем ошибка?
Может в правиле перемножения матриц?

Добавлено через 1 минуту
Donville, а вообще зачем возвращать массив?
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
10.05.2014, 00:26  [ТС]     Перемножение матриц #4
nmcf,
В main`e обнуляю:
C++
1
2
3
float **mas1 = 0;
float **mas2 = 0;
float **mul = 0;
Мне нужны только 3 цифры после запятой.

Добавлено через 39 секунд
S_el, Что именно не так в правиле?
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,912
10.05.2014, 00:29     Перемножение матриц #5
Donville, http://ru.wikipedia.org/wiki/%D3%EC%...BD.D0.B8.D0.B5

Добавлено через 52 секунды
Из википедии:
Цитата Сообщение от Wiki
Операция умножения двух матриц выполнима только в том случае, если число столбцов в первом сомножителе равно числу строк во втором; в этом случае говорят, что форма матриц согласована.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
10.05.2014, 00:50  [ТС]     Перемножение матриц #6
S_el, да нет, не в этом суть. Я конечно же проверил на соответствие строк/столбцов.
Тут по-моему дело даже не в формуле, а в чем-то другом (пока не разобрался в чем). Ниже приведу пример в картинках моей программы и онлайн сервиса.
http://hostingkartinok.com/show-imag...c05d14cb697049
http://hostingkartinok.com/show-imag...385ca02f77c1b4

Добавлено через 1 минуту
Может проблема в выделении памяти под массив? Програмка работает через раз
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,912
10.05.2014, 00:53     Перемножение матриц #7
Можете сравнить:
Умножение матриц

Добавлено через 1 минуту
Donville, поставь возвращаемое значение void , массив в аргументе функции и так по ссылке передается.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
10.05.2014, 01:00  [ТС]     Перемножение матриц #8
Спасибо за замечание! Поставил. В общем если матрицы квадратные, то все работает нормально, а вот если нет, то вылазит число 8.22...+032 и заменяет пару элементов.
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,912
10.05.2014, 01:06     Перемножение матриц #9
Donville, прогоните в отладчике и посмотрите как изменяются переменные.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
10.05.2014, 01:59  [ТС]     Перемножение матриц #10
Отладчиком не умею пользоваться.
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,912
10.05.2014, 07:45     Перемножение матриц #11
Тогда выводите на консоль каждую итерацию.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,478
10.05.2014, 07:57     Перемножение матриц #12
Автор, я не про указатели, а про значения тебе говорю. Обнулять нужно каждый элемент, перед циклом по v. Потому что неизвестно, что он там содержит. А все округления делать после цикла. Ты же понижаешь точность округляя каждую итерацию.
Память-то, кстати, выделил? Покажи место вызова этой функции.
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
10.05.2014, 14:32  [ТС]     Перемножение матриц #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float** Allocation(int row, int column) //function of allocation memory for matrix
{
        float **mas = new float *[row];
        for (int i = 0; i < row; i++)
        {
             mas[i] = new float [column];
        }
        return mas;
...
mul = Allocation(k,s);
Mult(mas1, mas2, mul, k, m, s);
 
for(i=0; i<k; i++) //Output the array
{
    for(j=0; j<k; j++)
    {
        cout << setw(8) << mul[i][j] << " ";
    }
 
    cout << endl;
}
 
}
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,478
10.05.2014, 14:44     Перемножение матриц #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так попробуй:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Mult(float **mas1, float **mas2, float **mul, int k, int m, int s)
{
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < s; j++)
        {
            mul[i][j] = 0;
            for (int v = 0; v < m; v++)
            {
                mul[i][j] += mas1[i][v] * mas2[v][j];
            }
            mul[i][j] = round(mul[i][j] * 1000) / 1000;
        }
    }
    return mul;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 15:12     Перемножение матриц
Еще ссылки по теме:

C++ перемножение матриц
Перемножение матриц C++
Перемножение матриц C++

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

Или воспользуйтесь поиском по форуму:
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 112
10.05.2014, 15:12  [ТС]     Перемножение матриц #15
Да, все заработало! Спасибо большое.
Yandex
Объявления
10.05.2014, 15:12     Перемножение матриц
Ответ Создать тему
Опции темы

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