2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Mathematica 8. Умножение матрицы 4х4
Сообщение31.03.2011, 20:58 


31/03/11
6
Здравствуйте! Отличный форум:)
У меня проблема с задачей где нужно умножить маттрицу 4х4 не используя dot
Точно такуеже задачу разбирали тут:http://dxdy.ru/topic29626.html, но только там 3х3 матрица. Там так и не довели до конца решение( Зделали конечно но не по правильному :-(
Я попыталась сама зделать, но куча ошибок при выполнении( может эта из за того что я новую версию математики скачала?
так вот по аналогии:
Код:
A = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}} // MatrixForm
B = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}} // MatrixForm
Q = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}} // MatrixForm

на название матрицы С математика говорила что С защищена :shock:
В той теме Leierkastenmann говорил что нужно использовать при обращении к элементу матрицы:
Цитата:
A[[i,j]]

Получается вот такой вариант:
Код:
mtx[A, B] :=
Block[{A, B},
  For[i = 1, i < 5, i++, For[j = 1, j < 5, j++, Q[[i_, j_]] = 0;
     For[k = 1, k < 5, k++,
      Q[[i_, j_]] = Q[[i, j]] + A[[i, k]]*B[[k, j]]]]] MatrixForm[Q]]
mtx[A, B]

В чем ошибка?

 Профиль  
                  
 
 
Сообщение31.03.2011, 21:38 
Заслуженный участник


25/02/11
1797
У вас матрицы не 4 на 4, справа подчеркивания при i,j не нужны и {A,B} тоже. А слева бы подчеркивание аргументов пригодилось, так же как и обозначения аргументов другими буквами. MatrixForm нужна только для вывода результатов, операции производить с такой формой не получится.

 Профиль  
                  
 
 
Сообщение31.03.2011, 21:44 
Заслуженный участник


27/04/09
28128
Имя С защищено, потому что используется для представления констант в решениях дифуров и некоторых других вещах. Маленькую букву можно использовать, а также различные модификации.

 Профиль  
                  
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение31.03.2011, 22:39 


31/03/11
6
Все запуталось.
Цитата:
справа подчеркивания при i,j не нужны и {A,B} тоже

но без {A,B} нельзя использовать Block
Код:
А слева бы подчеркивание аргументов пригодилось, так же как и обозначения аргументов другими буквами
так чтоли?
Код:
mtx[W_, E_]

вот что вышло:
Код:
mtx[W_, E_] :=
Block[{A, B},
  For[i = 1, i < 5, i++, For[j = 1, j < 5, j++, Q[[i, j]] = 0;
     For[k = 1, k < 5, k++,
      Q[[i, j]] = Q[[i, j]] + A[[i, k]]*B[[k, j]]]]] MatrixForm[Q]]
mtx[W_, E_]

что я не так исправила?

 Профиль  
                  
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение31.03.2011, 23:19 
Заслуженный участник


25/02/11
1797
Справа тогда А и В надо поменять на W и V, скажем (E зарезервировано). Вместо {A,B} можно писать {}, перед MatrixForm поставить точку с запятой, вызывать mtx с аргументами A, B без подчеркиваний, сами эти матрицы исправить...

 Профиль  
                  
 
 
Сообщение01.04.2011, 14:57 
Заслуженный участник


27/04/09
28128
MashaI, подчёркивание означает, что мы используем не данное имя, а делаем слот, в который можно засунуть что-нибудь, называемый таким именем. Потому подчёркивания нужны при определении функций, но не нужны при вызове — ведь при вызове мы подставляем конкретные значения.

Кстати, звёздочку умножения можно ещё убрать (зря Вольфрам, что ли, придумывал квадратные скобки для функций, чтобы отказаться от умножения где попало?).

(Что должно у вас получиться (сначала сами!))

Код:
mtx[W_, V_] :=
  Block[{},
    For[i = 1, i < 5, i++,
      For[j = 1, j < 5, j++,
        Q[[i, j]] = 0;
        For[k = 1, k < 5, k++,
          Q[[i, j]] = Q[[i, j]] + W[[i, k]] V[[k, j]]
        ]
      ]
    ];
    MatrixForm[Q]
  ]
mtx[A, B]
Однако, этот вариант неправильный, потому что Q не определено. Также этот вариант плох тем, что если мы изменим размеры матриц, функция работать перестанет. Кроме того, её название не отражает её сути. Ну и вообще, императивность должна быть в рамках, а не везде.

(Правильный вариант. Тщательно разобрать перед списыванием!)

Код:
MatrixProduct::"size" = "Matrices `1` and `2` have inappropriate sizes";
MatrixProduct[M1_?MatrixQ, M2_?MatrixQ] :=
  Block[{m, n, n2, p},
    {m, n} = Dimensions[M1];
    {n2, p} = Dimensions[M2];
    If[n != n2,
      Message[MatrixProduct::"size", M1, M2];
      Return[]
    ];
    Table[
      Sum[
        M1[[i, k]] M2[[k, j]],
        {k, n}
      ],
      {i, m}, {j, p}
    ] // MatrixForm
  ]
И вызывать (получше будет уже где-нибудь в другой ячейке) как MatrixProduct[A, B]

(Хочу сказать MashaI спасибо, кстати. Я теперь знаю, как сообщения генерировать. Естественным способом это могло бы быть намного позже.)

 Профиль  
                  
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение01.04.2011, 16:50 


31/03/11
6
Ребята! Спасибо вам за подсказки)
Но там где "готовый вариант", он сложноват, мы еще не проходили такие команды. Да и мне не нужно любые матрицы делать, именно 4х4.
Вот мой авриант переделанный, почиму неверный? там Q же определено в {} в начале?
Код:
Q = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}} // MatrixForm

(Оффтоп)

PS: всех с 1 апреля!))

Вроде бы получилось. из за //MatrixForm глюки, он не дает к элементам матрицы обращаться.
И еще матрицы в начале переименовала на A и B (вместо W и V)
Теперь так:
Код:
A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
B = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
Q = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}

mtx[W_, V_] := Block[{}, For[i = 1, i < 5, i++,
   For[j = 1, j < 5, j++, Q[[i, j]] = 0;
    For[k = 1, k < 5, k++,
     Q[[i, j]] = Q[[i, j]] + W[[i, k]] V[[k, j]]]]];
  MatrixForm[Q]]
mtx[A, B]

 Профиль  
                  
 
 
Сообщение01.04.2011, 17:34 
Заслуженный участник


27/04/09
28128
MashaI в сообщении #429986 писал(а):
из за //MatrixForm глюки, он не дает к элементам матрицы обращаться
Это невозможно, потому что подобные команды влияют только на вывод.

MashaI в сообщении #429986 писал(а):
Вот мой авриант переделанный, почиму неверный? там Q же определено в {} в начале?
Так делать нельзя. Инкапсуляция должна быть, т. е. все данные, которые не должны быть доступны никому, кроме функции умножения, должны быть в ней. По крайней мере, можно сделать так:
Код:
Block[
  {..., Q, ...},
  Q = Table[0, {4}, {4}];
  ...
]

Кстати, порекомендовал бы ещё убрать MatrixForm изнутри функции и засунуть в него вызов.

(Оффтоп)

Показалось, что вы не знаете, что такое //. Это нужно проходить на самых первых лекциях, если уж это включено в курс или куда там. expr // f эквивалентно f[expr], а также f @ expr — этот сахар бывает очень удобным.


-- Пт апр 01, 2011 20:48:45 --

arseniiv в сообщении #430005 писал(а):
Кстати, порекомендовал бы ещё убрать MatrixForm изнутри функции и засунуть в него вызов.
Это из такого расчёта: функция не должна «указывать» пользователю, как оформлять свой результат.

 Профиль  
                  
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение01.04.2011, 18:33 
Аватара пользователя


15/01/06
200
Первоапрельское перемножение матриц :mrgreen:
Код:
MP[X_, Y_] := Module[
  {
   dimX = Dimensions[X],
   dimY = Dimensions[Y],
   Q
   },
  If[MatrixQ[X] && MatrixQ[Y] && dimX[[2]] == dimY[[1]],
   Q = Table[
     Plus @@ Thread[Times[X[[i]], #[[j]] & /@ Y]], {i, dimX[[1]]}, {j,
       dimY[[2]]}],
   Q = $Failed
   ];
  Return[Q]
  ]

 Профиль  
                  
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение01.04.2011, 20:07 


31/03/11
6
Спасибо, подправила:
Код:
A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
B = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
mtx[W_, V_] :=
Block[{Q}, Q = Table[0, {4}, {4}];
  For[i = 1, i < 5, i++,
   For[j = 1, j < 5, j++, Q[[i, j]] = 0;
    For[k = 1, k < 5, k++,
     Q[[i, j]] = Q[[i, j]] + W[[i, k]] V[[k, j]]]]]]
mtx[A, B]
MatrixForm[Q]

А как в MatrixForm[Q] вызов зделать?

(Оффтоп)

Я не очень сильна в синтаксисе) он чем то схож с С++. Нам просто раздают распечатки с заданиями и небольшим описанием команд которые требуются для задания:)

 Профиль  
                  
 
 
Сообщение01.04.2011, 20:58 
Заслуженный участник


27/04/09
28128
MashaI в сообщении #430092 писал(а):
он чем то схож с С++
:o От удивления уснул.

 Профиль  
                  
 
 
Сообщение03.04.2011, 14:32 
Заслуженный участник


27/04/09
28128
MashaI в сообщении #430092 писал(а):
А как в MatrixForm[Q] вызов зделать?
Смотрите — Q только внутри блока, значит, вне блока его «не видно». Нам нужно получить результат в матричном виде, а результат выдаётся из mtx[A, B]. Значит, именно это выражение нужно подставить в MatrixForm[...].

 Профиль  
                  
 
 Re:
Сообщение04.04.2011, 11:15 


31/03/11
6
arseniiv в сообщении #430779 писал(а):
MashaI в сообщении #430092 писал(а):
А как в MatrixForm[Q] вызов зделать?
Смотрите — Q только внутри блока, значит, вне блока его «не видно». Нам нужно получить результат в матричном виде, а результат выдаётся из mtx[A, B]. Значит, именно это выражение нужно подставить в MatrixForm[...].

я так и делала, но почиму то выдается результат Null

 Профиль  
                  
 
 
Сообщение04.04.2011, 14:56 
Заслуженный участник


27/04/09
28128
Ах да, последним «оператором» в блоке должно быть QFor'ы значения не возвращают. Т. е.
Код:
A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
B = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
mtx[W_, V_] :=
  Block[{Q},
    Q = Table[0, {4}, {4}]; (* возвращает матрицу 4×4 из нулей*)
    For[i = 1, i < 5, i++,
      For[j = 1, j < 5, j++,
        Q[[i, j]] = 0;
        For[k = 1, k < 5, k++,
          Q[[i, j]] = Q[[i, j]] + W[[i, k]] V[[k, j]]
        ]
      ]
    ]; (* ничего не возвращает, т. е. на деле возвращает Null *)
    Q (* возвращает результат *)
  ]
MatrixForm[mtx[A, B]]

 Профиль  
                  
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение05.04.2011, 01:20 


31/03/11
6
arseniiv спасибо большое за помощь!)) очень помогли :roll:

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group