![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
17. При решении некоторых задач матрица может быть всегда квадратной и симметричной относительно главной диагонали. Для экономии опера-тивной памяти в этом случае прибегают к специальным способам хране-ния таких матриц, например, хранят часть матрицы выше главной диаго-нали, построчно в одномерном массиве. Составить программу вычисле-ния ATA, где A - симметричная матрица, заданная специальным спосо-бом хранения. Произведение вида ATA всегда симметрично. Исходные данные вводить с клавиатуры.
За ранее спасибо кто решит... Ребят задачу сказали как то через форму решать... плз кто сможет сделайте |
|
#2
|
||||
|
||||
|
Насчет экономии памяти - довольно спорное утверждение. Это зависит от размерности данных. Если скажем у меня матрица с элементами типа байт, то произведение элементов недолжно превышать 255 - что маловероятно.
Задумка вообще оригинальная, только мне непонятен обратный процесс получения двух элементов из одного. Допустим у меня есть 3 и 5 произведение будет 15. Но из 15 я могу получить обратно как минимум 2 варианта. 5,3 и 3,5 Как спрашивается узнать правильное положение элемента относительно диагонали? |
|
#3
|
|||
|
|||
|
ппц задачи.... не могу что делать Экзамен на носу =((((( помогите плз
|
|
#4
|
||||
|
||||
|
Я так понял, что есть матрица вида
Код:
1 2 3 4 2 5 6 7 3 6 8 9 4 7 9 0 Код:
1 2 3 4 5 6 7 8 9 0 Код:
k:=1; for i:=1 to N do for j:=i to N do begin a[i,j]:=b[k]; inc(k); end; Код:
for i:=1 to N do for j:=i+1 to N do a[j,i]:=a[i,j]; Можно эти два шага сразу: Код:
k:=1; for i:=1 to N do for j:=i to N do begin a[i,j]:=b[k]; a[j,i]:=b[k]; inc(k); end; Как-то так. Получишь нужную матрицу. А дальше я не понимаю, что значит "произведение вида АТА". Если это А*Т*А то не знаю чего за Т. Так что дальше спрашиваешь Вику или Гугл "умножение матриц", после чего выполняешь указанные там инструкции. Последний раз редактировалось Bargest, 23.12.2010 в 18:54. |
|
#5
|
|||
|
|||
|
По поводу хранения - это некоторый вариант хранения разреженных матриц. Фактически, тебе нужна функция, которая переведет координаты двумерного массива в координаты одномерного. В этой функции д.б. 2 ветки - координаты выше главной диагонали и ниже. Во втором случае надо их "отразить" и вернуться к первой ветке.
Код:
function GetIndex(I, J, N : Integer) : Integer;
// I, J - координаты в "квадрате"
// N - размер матрицы
// Result - коорд в линейном массиве
begin
If J > I
Then // Ниже диагонали
Begin
Result := GetIndex(J,I,N);
End
Else // Выше диагонали и диагональ
Begin
// Трансляция координат матрицы в линейный массив
// Сделаешь сам :)
End; |
|
#6
|
||||
|
||||
|
Ага, после неоднократного прочтения задания до меня дошло, что матрица-то симметричная и следовательно множитель и множимое идентичны и в этом случае без разницы какой из элементов откуда изначально взят.
Тогда получается, что получить обратно элементы можно получив квадратный корень из числа. |