![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите перемножить две матрицы [D6, WinXP]
Pass[word] © (2005-09-26 19:14:00)Нужно в Delphi умножить друг на друга две матрицы. Подскажите, как это сделать. Есть ли для Delphi модули, облегчающие работу с матрицами. Кто знает?
Loginov Dmitry (2005-10-02 00:37:00) [1]Удалено модератором
IJ (2005-10-01 23:42:00) [2]Удалено модератором
Student2006 (2005-09-28 22:29:00) [3]Спасибо _111_. Только я еще не скачал архив, связь вчера была слишком поганая. Но то, что он лучше МатЛаба, ты загнул.
_111_ (2005-09-28 00:16:00) [4]
> Скажите, кто знает, что можно делать с этим матриксом...
HELP почитай. Много воды, но что-то понять можно.
Вроде здоровые матрицы перемножает :)
а вообще Matrix лучше чем MatLab, хотя бы по тому что в Delphi...
Student2006 (2005-09-27 23:12:00) [5]Доброго всем времени суток. Я только что прочитал тему. Скажите, кто знает, что можно делать с этим матриксом и что это, вообще такое (библиотека, компонент?). Мне нужна хорошая реализация работы с матрицами большого размера, операций с ними. Заранее спасибо.
Jeer (2005-09-27 10:08:00) [6]MBo © (26.09.05 23:00) [17]
Потерянные дети - утерянные знания:(
Pass[word] (2005-09-27 01:08:00) [7]Ура! Получилось. Matrix - супер!. С меня пиво :)
MBo (2005-09-26 23:00:00) [8]>Loginov Dmitry (26.09.05 22:22) [14]
>MBo, ты не въехал в тему?
Ну что поделаешь, не все же такие сообразительные :(
Eraser (2005-09-26 22:52:00) [9]
> Pass[word] © (26.09.05 19:14)
Вот пример на QBasic'e в котором есть всё что нужно для перемножения матриц.
Код конечно не супер, на 1 курсе делал, почти не зная QBasic.
DECLARE SUB mult (a(), b(), r())
DECLARE SUB transp (a(), r())
DECLARE SUB obr (a(), r())
DECLARE SUB getad (a(), i, j, ad)
OPTION BASE 1
CLS
n = 3
m = 3
l = 3
DIM a(3, 3)
DIM b(3, 3)
DIM c(3), rs(3)
DIM x(3, 3)
DIM r(3, 3), sm1(3, 3), sm2(3, 3)
COLOR 15
' 1 matrix
'DATA 1,2,3,4, 5,6,7,8, 9,1,0,2, 3,7,1,5
'DATA 12,22,32,24, 75,96,87,88, 90,11,10,22, 23,47,41,55
'FOR j = 0 TO 3
' READ a(0, j), a(1, j), a(2, j), a(3, j)
'NEXT j
' 2 matrix
'DATA 3,2,1,2, 1,3,4,3, 0,4,3,6, 7,1,0,9
'DATA 31,22,31,42, 51,39,48,37, 0,24,33,76, 57,41,30,19
'FOR j = 0 TO 3
' READ b(0, j), b(1, j), b(2, j), b(3, j)
'NEXT j
FOR j = 1 TO 3
FOR i = 1 TO 3
a(i, j) = INT(RND(1) * 100)
NEXT i
NEXT j
'
FOR j = 1 TO 3
FOR i = 1 TO 3
b(i, j) = INT(RND(1) * 100)
NEXT i
NEXT j
'
FOR i = 1 TO 3
c(i) = INT(RND(1) * 100)
NEXT i
' printing...
PRINT "Њ ваЁж A:"
FOR j = 1 TO 3
PRINT a(1, j), a(2, j), a(3, j)
NEXT j
PRINT "Њ ваЁж B:"
FOR j = 1 TO 3
PRINT b(1, j), b(2, j), b(3, j)
NEXT j
PRINT "Њ ваЁж C:"
FOR i = 1 TO 3
PRINT c(i),
NEXT i
CALL transp(a(), r())
CALL obr(b(), sm1())
FOR j = 1 TO 3
FOR i = 1 TO 3
sm2(i, j) = r(i, j) + sm1(i, j)
NEXT i
NEXT j
CALL obr(sm2(), sm1())
CALL mult(c(), sm1(), rs())
PRINT "ђҐ§г«мв в ¬ ваЁж X:"
PRINT rs(1), rs(2), rs(3)
SUB getad (a(), i, j, ad)
DIM mx(2, 2)
curi = 1
curj = 1
FOR j1 = 1 TO 3
FOR i1 = 1 TO 3
IF (i1 <> i) AND (j1 <> j) THEN
mx(curi, curj) = a(i1, j1)
IF (curi = 1) AND (curj = 1) THEN
curi = 2
GOTO m
END IF
IF (curi = 2) AND (curj = 1) THEN
curi = 1
curj = 2
GOTO m
END IF
IF (curi = 1) AND (curj = 2) THEN
curi = 2
GOTO m
END IF
m:
END IF
NEXT i1
NEXT j1
ad = mx(1, 1) * mx(2, 2) - mx(2, 1) * mx(1, 2)
END SUB
SUB mult (a(), b(), rs())
'FOR i = 1 TO 3
FOR j = 1 TO 3
s = 0
FOR k = 1 TO 3
s = s + a(k) * b(j, k)
NEXT k
rs(j) = s
NEXT j
'NEXT i
END SUB
SUB obr (a(), r())
dt = -a(2, 1) * (a(1, 2) * a(3, 3) - a(1, 3) * a(3, 2)) + a(2, 2) * (a(1, 1) * a(3, 3) - a(1, 3) * a(3, 1)) - a(2, 3) * (a(1, 1) * a(3, 2) - a(1, 2) * a(3, 1))
FOR j = 1 TO 3
FOR i = 1 TO 3
CALL getad(a(), i, j, ad1)
r(j, i) = ad1 / dt
opr = (-1) ^ (i + j)
IF opr < 0 THEN
opr = -r(j, i)
r(j, i) = opr
END IF
NEXT i
NEXT j
END SUB
SUB transp (a(), r())
FOR j = 1 TO 3
FOR i = 1 TO 3
r(j, i) = a(i, j)
NEXT i
NEXT j
END SUB
Сайбель Алексей (2005-09-26 22:37:00) [10]Он просто хочет добиться просветления у отдельно взятого индивидума.
Loginov Dmitry (2005-09-26 22:22:00) [11]MBo, ты не въехал в тему?
Loginov Dmitry (2005-09-26 22:20:00) [12]Для таких как ты, Pass[word], в Matrix'е есть отличная справочная система. Почитай, там все написано. Все необходимое для первого времени есть в разделе справки "Функции ядра".
Измененный код будет выглядеть следующим образом:
...........................
var
I, J: Integer;
S: String;
begin
with Base do begin
// Создаем матрицы
NewArray('A', 5, 4);
NewArray('B', 4, 6);
// Заполняем массив А
for I := 1 to 5 do
for J := 1 to 4 do
Elem['A', I, J] := I * J;
// Заполняем массив В
for I := 1 to 4 do
for J := 1 to 6 do
Elem['B', I, J] := I + J;
// Перемножаем матрицы
MulMatrix('A', 'B', 'C');
// Сохраняем весь массив
SaveArrayToString(S, 'C');
// Или только его элементы
//SaveArrayToValues(S, 'C');
end;
// Выводим результат в Memo
Memo1.Text := S;
end;
MBo (2005-09-26 22:16:00) [13]>Pass[word]
Ты знаешь принцип перемножения матриц?
Сij=Sum(over k) Aik* Bkj
Разве трудно написать соответствующий код?
Pass[word] (2005-09-26 22:08:00) [14]С умножением все ясно, но в моих матрицах не случайные элементы, а конкретные значения. Как мне их ввести в Matrix'е. Во-вторых, необходимо вывести элементы полученной матрицы в Memo.Что для этого надо сделать?
Loginov Dmitry (2005-09-26 21:45:00) [15]
> Pass[word] писал:
> Matrix, конечно, очень навороченная штука, но как, я не
> пойму, в нем можно перемножить мои матрицы?
Допустим, у тебя есть матрицы A (5х4) и B (4х6), заполненные случайными числами от 0 до 1. В результате тебе нужно получить матрицу C (5х6). Подключаешь вUsesмодуль Matrixи пишешь следующий код:
with Base do begin
// Создаем матрицы
NewArray('A', 5, 4);
NewArray('B', 4, 6);
// Заполняем случайными числами
RandomAr('A');
RandomAr('B');
// Перемножаем матрицы
MulMatrix('A', 'B', 'C')
end;
Вот и все
Pass[word] (2005-09-26 21:28:00) [16]Matrix, конечно, очень навороченная штука, но как, я не пойму, в нем можно перемножить мои матрицы?
Loginov Dmitry (2005-09-26 21:08:00) [17]Удалено модератором
Loginov Dmitry (2005-09-26 21:06:00) [18]
> Pass[word] писал:
> ... Распаковал, и че дальше? Куча всяких файлов, ничего
> не понятно.
А ты информацию по установке читал? Там написано "После распаковки прочтите раздел справки "Система Matrix". Для этого в папке Help следует запустить программу HelpViewer.exe". Вопросы есть?
IJ (2005-09-26 20:54:00) [19]Удалено модератором
IJ (2005-09-26 20:52:00) [20]Лезь на http:\\delphimatrix.narod.ru.
Я сам прогер. Данный модуль позволяет создавать динамические
матрицы и проводить с ними математические операции.
Фактически тот же Matlab, только у тебя на форме )