2014 dxdy logo

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

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




 
 Mathematica 8. Умножение матрицы 4х4
Сообщение31.03.2011, 20:58 
Здравствуйте! Отличный форум:)
У меня проблема с задачей где нужно умножить маттрицу 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 
У вас матрицы не 4 на 4, справа подчеркивания при i,j не нужны и {A,B} тоже. А слева бы подчеркивание аргументов пригодилось, так же как и обозначения аргументов другими буквами. MatrixForm нужна только для вывода результатов, операции производить с такой формой не получится.

 
 
 
 
Сообщение31.03.2011, 21:44 
Имя С защищено, потому что используется для представления констант в решениях дифуров и некоторых других вещах. Маленькую букву можно использовать, а также различные модификации.

 
 
 
 Re: Mathematica 8. Умножение матрицы 4х4
Сообщение31.03.2011, 22:39 
Все запуталось.
Цитата:
справа подчеркивания при 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 
Справа тогда А и В надо поменять на W и V, скажем (E зарезервировано). Вместо {A,B} можно писать {}, перед MatrixForm поставить точку с запятой, вызывать mtx с аргументами A, B без подчеркиваний, сами эти матрицы исправить...

 
 
 
 
Сообщение01.04.2011, 14:57 
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 
Ребята! Спасибо вам за подсказки)
Но там где "готовый вариант", он сложноват, мы еще не проходили такие команды. Да и мне не нужно любые матрицы делать, именно 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 
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 
Аватара пользователя
Первоапрельское перемножение матриц :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 
Спасибо, подправила:
Код:
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 
MashaI в сообщении #430092 писал(а):
он чем то схож с С++
:o От удивления уснул.

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

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

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

 
 
 
 
Сообщение04.04.2011, 14:56 
Ах да, последним «оператором» в блоке должно быть 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 
arseniiv спасибо большое за помощь!)) очень помогли :roll:

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group