![]() |
|
Модераторы: Poseidon |
![]()
|
|
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
Уважаемые форумчане, необходима подсказка, а точнее помощь в написании алгоритма. Я уже голову сломал.
Надо умножить матрицу А на матрицу B. матрица A (R nxn) - симметричная, содержимое храниться только в верхнетреугольной части матрицы. матрица B (R nxm)- прямоугольная матрица. Пишу на Си. Буду благодарен за любую помощь. Заранее спасибо! |
|||
|
||||
| Reaver |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.12.2006 Репутация: нет Всего: нет |
Все просто. Данный кусок кода написан на Delphi, но на Си перенести его можно без проблем:
Где: MatrixB.Col - число столбцов матрицы В MatrixА.Col - число столбцов матрицы А MatrixА.Row - число строк матрицы A |
|||
|
||||
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
Спасибо. Но этот алгоритм не совсем подходит. Данный алгоритм просто перемножает матрицы. А нужен именно алгоритм способный перемножать обычную прямоугольную матрицу и симметричную матрицу, причем в симметричной матрице, содержимое храниться в верней треугольной части, а нижняя часть, как я понимаю заполнена нулями, т.е. например C = A * B
где: A { {1, 2, 3} {0, 4, 5} {0, 0, 6} } - симметричная, содержимое храниться только в верхнетреугольной части матрицы. B { {1, 2} {3, 4} {5, 6} } - прямоугольная матрица. Вот как то так. Может кто знает ещё алгоритмы? |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 2 Всего: 317 |
для того, чтобы все это сделать, стоит знать что такое симметричная матрица.... потому как судя по твоему посту ты это еще не знаешь. а вопрос этот в раздел по алгоритмам не тянет. Добавлено через 3 минуты и 29 секунд salat, давай подумаем вместе... где тут симметрия:
? эта матрица "верхнеугольная", но не симметричная. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Reaver |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 28.12.2006 Репутация: нет Всего: нет |
Приведенный выше алгоритм универсален. Абсолютно без разницы, обычные, треугольные или симметричные матрицы ему умножать. Главное, чтоб размерности подходили.
|
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 2 Всего: 317 |
Reaver, возможно имелось в виду оптимизация.
если время вычисления суммы на строке 4 и время доступа до ячеек = О(1), твой алгоритм имеет сложность: O( MatrixB.Col x MatrixА.Col x MatrixА.Row), или грубо говоря О(n^3). Возможно при понимании, что матрица симметрична, циклы сокращаются(т.к. a(i,j)=a(j,i)) и в результате все доходит до более высокой скорости, т.е. столбики можно проходит до половины, а остальное "угадывать". -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
Как я понял из задания, что матрица симметричная т.е.
1 2 3 2 4 5 3 5 6 Но, представлена она по хитрому, т.е. 1 2 3 0 4 5 0 0 6 Это значит, что для вычисления значения формулы, нужно обращаться только к тем элементам матрицы, которые находятся выше главной диагонали или на ней. Нижняя часть заполнена нулями и обращаться к этой части нельзя. А симметрия - это типа "подсказки" взадании, что вместо элементов из нижнего треугольника нужно использовать элементы из верхнего треугольника. Т.е. элементы из нижней части, тоже надо использовать при перемножении в результирующей матрице, но только за место них брать верхние при умножении. P.S. да я согласен, что не силен в матрицах, поэтому и обратился за помощью. И вроде все просто, но возникли трудности. Требуют алгоритм оптимальный, он будет использоваться, для программирования процессора, поэтому и такие условия. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 2 Всего: 317 |
покажи свои "трудности", и мы тебе поможем его доработать. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
Трудности собственно в написании алгоритма, как именно его реализовать, т.е. есть алгоритм перемножения матриц, для вышеописанного случая, вот такой например
for(i=0;i<3;i++) { for(j=0;j<2;j++) { for(k=0;k<3;k++) { matrix_c[i][j] += matrix_a[i][k] * matrix_b[k][j]; } } } Первые два прохода j (т.е. первая строка результирующей матрицы - matrix_c[0][0] и matrix_c[0][1]) всё ок, ну это и понятно, но дело доходит до второй строки и в матрице А("симметричной") присутствует ноль(matrix_a[1][0]), но вместо этого нуля нужно брать так скажем "симметричный" ему элемент, т.е. 2-ку - matrix_a[0][1](опять же рассматривая описанный выше пример). Но записывать результат в matrix_c[1][0]. Дальше не описываю, т.к. надеюсь мысль ясна. В итоге должна получиться матрица matrix_c размерностью 3х2. Ну как и с обычным перемножением. Вот собственно в организации такого алгоритма и состоит трудность. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 2 Всего: 317 |
ты не заметил, что "симметричный" элемент элементу i,j - элемент j,i.
у тебя в левой матричке даны только элементы i,j, так, что i<=j. остальные - 0. Добавлено через 13 минут и 29 секунд
-------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
К сожалению, и этот алгоритм не работает((
|
|||
|
||||
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
В итоге получился вот такой алгоритм, вроде работает, но не проверял ещё, только на бумаге))
for(i=0; i<NSIZE; i++){ for(j=0; j<MSIZE; j++){ D[i][j] = 0.0; for(k=0; k<NSIZE; k++){ if(i=0){ D[i][j] += (A[i][k]*B[k][j]); } else if(k<=i){ D[i][j] += (A[k][i]*B[k][j]); } else D[i][j] += (A[i][k]*B[k][j]); } } } Правда условий мне кажется слишком много.... может как-нить его упростить можно... Спасибо bilbobagginz за помощь!!! |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 2 Всего: 317 |
это не алгоритм а код. в каком случае мой код дает неверный ответ? а вот за это ... линейкой по пальцам надо бить.... для избежания такого удобно писать постоянную слева:
такой код не скомпилируется и выйдет ошибка. т.к. надо было писАть ==. твой код - скомпилируется, и будешь отлавливать. суслика в поле. Это сообщение отредактировал(а) bilbobagginz - 14.12.2009, 01:10 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| salat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.11.2009 Репутация: нет Всего: нет |
Да уж это точно, по запаре написал... не о синтаксисе думал...
В твоем коде, на элементе [1][0] в результирующей матрице, на 3-м проходе k, обращение происходит к A[2][1] который равен 0, ну и так далее... |
|||
|
||||
| bilbobagginz |
|
||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 2 Всего: 317 |
блин я спутал, проверка должна быть:
тоже торможу -------------------- Я ещё не демон. Я только учусь. |
||||
|
|||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |