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

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

Восстановить пароль Регистрация
 
Mr.Armik
2 / 2 / 0
Регистрация: 11.06.2010
Сообщений: 88
09.07.2012, 16:48     Перемножение матриц #1
Доброго времени суток.

Подскажите как разобраться с перемножением матриц, если есть 2 матрицы размерностью МхМ (М = 2000-5000), элементами которых являются в свою очередь матрицы NxN (N = 4);

Как перемножить 2 простые матрицы я знаю, но как представить матрицу в матрице, и сделать умножение... Преподаватель говорил что то на счет ссылок вроде.

Может есть у кого какие соображения прошу поделиться.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 16:48     Перемножение матриц
Посмотрите здесь:

C++ Перемножение матриц
Перемножение 2-ух матриц C++
Перемножение матриц. C++
Перемножение матриц C++
C++ перемножение матриц
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.07.2012, 16:57     Перемножение матриц #2
Представляем лист в клеточку. В каждой клеточке еще 4 клетки. Таким образом кол-во клеток просто ворастает.

http://ru.wikipedia.org/wiki/Умножение_матриц
Mr.Armik
2 / 2 / 0
Регистрация: 11.06.2010
Сообщений: 88
09.07.2012, 17:12  [ТС]     Перемножение матриц #3
на бумаге я могу сделать как захочу, меня интересует как представляется это в С++.
это надо делать через 3 звездочки или че? (***mass)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2012, 17:16     Перемножение матриц #4
Mr.Armik, пишете шаблонный класс матрицы и перегружаете оператор умножения. Делов-то.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
09.07.2012, 17:18     Перемножение матриц #5
Мне самым простым решением представляется разработка класса матрицы, который "умеет" перемножать матрицу на матрицу; ну, может быть, еще на константу и на вектор, если потребуется. В противном случае, ты очень-очень лехко запутаешься со всеми этими ***mass и будешь искать ошибки очень долго.
А дальше эти вложенные матрицы можно наворачивать сколь угодно, лишь бы памяти хватило....
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.07.2012, 17:23     Перемножение матриц #6
Цитата Сообщение от Mr.Armik Посмотреть сообщение
это надо делать через 3 звездочки или че? (***mass)
*** - это если указатель на указатель на указатель.
нужно использовать matrix[1][1][1][1] - вторя строка второй столбец и во внутреней так же.

пример с бумагой к тому, что такая матрица не отличается от другой обычной матрицы.

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
разработка класса матрицы, который "умеет" перемножать матрицу на матрицу
гы - не верно по принцыпам ООП
нужно представить класс матрицы и написать глобальный оператор умножения.
Mr.Armik
2 / 2 / 0
Регистрация: 11.06.2010
Сообщений: 88
09.07.2012, 17:33  [ТС]     Перемножение матриц #7
может кто кусочек кода скинет? ) а то поболтать я и сам могу )
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.07.2012, 17:37     Перемножение матриц #8
кода?
дык как матрица-то организованна?
C++
1
int matrix[9][9][3][3];
так?

http://www.boost.org/doc/libs/1_50_0.../doc/index.htm
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
09.07.2012, 17:41     Перемножение матриц #9
Ищи в инете книгу: Леен Аммерааль, STL для программистов на C++. Там есть готовая реализация класса матрицы произвольного размера, включая нужное тебе умножение.
Mr.Armik
2 / 2 / 0
Регистрация: 11.06.2010
Сообщений: 88
09.07.2012, 17:44  [ТС]     Перемножение матриц #10
Не в умножении загвоздка, а в представлении матрицы, элементами который являются матрицы поменьше.

т.е. есть Большая матрица, элементами которой есть матрицы поменьше. Как динамически объявить такую матрицу?

Писать свой какой то новый класс "матрица" не очень хочется, потому как в последствии мне надо будет вставлять ассемблеровкие вставки.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
09.07.2012, 17:50     Перемножение матриц #11
Тебе нужен шаблонный класс.
C++
1
template <class T> class matrix { ... };
Чем специализируешь тип элементов (это самый class T) - то и будет: хоть матрица целых, хоть матрица матриц, и применяя этот принцип последовательно - получишь с какой угодно вложенностью.
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.07.2012, 17:52     Перемножение матриц #12
либо буст, там это реализованно.
либо можно самому использовать vector<vector<int> > например для двухмерной или больше для многомерной.

у буста это будет кажется
C++
1
2
3
4
using namespace boost::numeric::ublas;
matrix<double> m (3, 3);
// или
vector<double> v (3);
динамично средствами с++ не объявишь, только заданный размер.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2012, 17:55     Перемножение матриц #13
Цитата Сообщение от _stealth_ Посмотреть сообщение
только заданный размер.
Чего?
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.07.2012, 18:00     Перемножение матриц #14
ну размер нужно указать при компиляции (это если юзать типа
C++
1
2
int i[10]; // ok
int i[x]; // not good
)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2012, 18:08     Перемножение матриц #15
Цитата Сообщение от _stealth_ Посмотреть сообщение
ну размер нужно указать при компиляции (это если юзать типа
Это понятно.
Поясню: мне показалось, что под "только заданный размер" вы подогнали еще и vector с matrix, т.е. что их размер можно задавать только на этапе компиляции. Поэтому и спросил.
Mr.Armik
2 / 2 / 0
Регистрация: 11.06.2010
Сообщений: 88
09.07.2012, 18:28  [ТС]     Перемножение матриц #16
Скажите, вот предположим есть функция генерирует квадратную матрицу. Как вернуть указатель на эту матрицу, или ссылку. И в чем разница указателя и ссылки? )

C++
1
2
3
4
5
6
7
8
9
10
11
double** generation(int n)
{
    double **a = new double*[n];
    for(int i=0;i<n;i++)
    {
        a[i] = new double[n];
        for(int j=0;j<n;j++)
            a[i][j] = rand()%100;
    }
    return a;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2012, 21:34     Перемножение матриц
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
11.07.2012, 21:34     Перемножение матриц #17
ссылка - это, можно сказать, сама переменнрая. указатель на переменную - это указатель на какую-то область памяти, которя используется (в ошибочный случаях может и не использоваться) какой-либо переменной.

чтобы получить указатель на массив, нужно просто взять адрес первго элемента. Это и будет указатель на первый элемент массива, за ним будет второй, потом 3й... (передвигаемся либо [] либо ++).

Зачем две-то звездочки? Важно понять, что для компьютера не существует никаких массивов, для него, в его памяти, это просто последовательность байтов. Например, если у нас массив из 2х int, то в мамяти компа это будут два элемента, стоящие друг за другом.

лучше не использовать указатели, особенно на таком уровне подготовке - есть готовые классы для матриц.
Yandex
Объявления
11.07.2012, 21:34     Перемножение матриц
Ответ Создать тему
Опции темы

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