2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Процедура в Mathematica
Сообщение20.01.2010, 00:14 


28/10/08
33
Здравствуйте Ув.Гуру
У меня такой вопрос: вот надо матрицу на матрицу умножить в процедуре, не могу разобраться с процедурой. Для начала пытаюсь вывести просто матрицу через проц. как это правильно зделать? Мой вариант:
Код:
Mtx[_a1, _a2, _a3, _a4] := block[{A}, A = {{a1, a2}, {a3, a4}} MatrixForm[A]]

и запрос затем:
Код:
Mtx[1, 2, 3, 4]

Выводит:
Код:
Mtx[1, 2, 3, 4]

чет нето...
Помагите пож-ста.

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 16:28 


28/10/08
33
с вводом выводом разобрался, теперь еще вопрос:
как передать параметр i в цикле, например for [ i=1, i<10, i++, ...
далее нужно будет C[i] или C{i} вот этот параметр как передается правильно? неодин из написаных вариантов нестал работать...

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 20:24 
Аватара пользователя


15/01/06
200
pointXY в сообщении #281923 писал(а):
с вводом выводом разобрался, теперь еще вопрос:
как передать параметр i в цикле, например for [ i=1, i<10, i++, ...
далее нужно будет C[i] или C{i} вот этот параметр как передается правильно? неодин из написаных вариантов нестал работать...


С[[i]], если под C подразумевается список/таблица.

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 20:45 


28/10/08
33
Спасибо, разобрался с индексами...
Прошу посмотреть код и указать ошибку:
Код:
a[1, 1] = 1
a[1, 2] = 2
a[1, 3] = 3
a[2, 1] = 4
a[2, 2] = 5
a[2, 3] = 6
a[3, 1] = 7
a[3, 2] = 8
a[3, 3] = 9

b[1, 1] = 1
b[1, 2] = 2
b[1, 3] = 3
b[2, 1] = 4
b[2, 2] = 5
b[2, 3] = 6
b[3, 1] = 7
b[3, 2] = 8
b[3, 3] = 9

A = {{a[1, 1], a[1, 2], a[1, 3]}, {a[2, 1], a[2, 2],
   a[2, 3]}, {a[3, 1], a[3, 2], a[3, 3]}}
B = {{b[1, 1], b[1, 2], b[1, 3]}, {b[2, 1], b[2, 2],
   b[2, 3]}, {b[3, 1], b[3, 2], b[3, 3]}}
MatrixForm[A]
MatrixForm[B]
в первой части не должно быть ошибки, но вдруг.
далее:
Код:
mtx[A, B] := Block[{A, B},
  For[i = 1, i < 4, i++,
    For[j = 1, j < 4, j++,
     c[i_, j_] = 0;
     For[k = 1, k < 4, k++,
      c[i_, j_] = c[i, j] + a[i, k]*b[k, j]
      ]]]
   MatrixForm[{{c[1, 1], c[1, 2], c[1, 3]}, {c[2, 1], c[2, 2],
      c[2, 3]}, {c[3, 1], c[3, 2], c[3, 3]}}]]
mtx[A, B]

результат:
Код:
150 150 150
150 150 150
150 150 150

когда должен быть:
Код:
30 36 42
66 81 96
102 126 150

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 21:05 
Аватара пользователя


15/01/06
200
pointXY в сообщении #282044 писал(а):
Спасибо, разобрался с индексами...
Прошу посмотреть код и указать ошибку:
Код:
a[1, 1] = 1
a[1, 2] = 2
a[1, 3] = 3
a[2, 1] = 4
a[2, 2] = 5
a[2, 3] = 6
a[3, 1] = 7
a[3, 2] = 8
a[3, 3] = 9

b[1, 1] = 1
b[1, 2] = 2
b[1, 3] = 3
b[2, 1] = 4
b[2, 2] = 5
b[2, 3] = 6
b[3, 1] = 7
b[3, 2] = 8
b[3, 3] = 9

A = {{a[1, 1], a[1, 2], a[1, 3]}, {a[2, 1], a[2, 2],
   a[2, 3]}, {a[3, 1], a[3, 2], a[3, 3]}}
B = {{b[1, 1], b[1, 2], b[1, 3]}, {b[2, 1], b[2, 2],
   b[2, 3]}, {b[3, 1], b[3, 2], b[3, 3]}}
MatrixForm[A]
MatrixForm[B]
в первой части не должно быть ошибки, но вдруг.
далее:
Код:
mtx[A, B] := Block[{A, B},
  For[i = 1, i < 4, i++,
    For[j = 1, j < 4, j++,
     c[i_, j_] = 0;
     For[k = 1, k < 4, k++,
      c[i_, j_] = c[i, j] + a[i, k]*b[k, j]
      ]]]
   MatrixForm[{{c[1, 1], c[1, 2], c[1, 3]}, {c[2, 1], c[2, 2],
      c[2, 3]}, {c[3, 1], c[3, 2], c[3, 3]}}]]
mtx[A, B]

результат:
Код:
150 150 150
150 150 150
150 150 150

когда должен быть:
Код:
30 36 42
66 81 96
102 126 150


Это вообще что? :shock: Зачем такие перенавороты для того, чтобы просто перемножить две матрицы? Странная какая-то форма записи. Зачем вы пишете a[1,1] = 1, потом из этого множества делаете матрицу простым перечислением? Чем не угодила запись A={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}? И обращайтесь спокойно к любому элементу матрицы как A[[i,j]]. Далее, как связано произведение матриц A и B с тем, что написано в функции, в функцию передаете матрицы, а работаете там с величинами, которые определены до матрицы?
Замените c[i_, j_] на c[i, j] и ваше "еретическое" перемножение матриц тоже по случайному совпадению даст верный результат. А вообще проще было бы написать A.B и получить ответ.

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 21:32 


28/10/08
33
Спасибо))
A={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} пробовал - неполучалось цикл зделать. Мне нужна процедура, которая перемножает две любые матрицы размером 3х3, у меня значения этих матриц задаются вначале и дальше процедура. А функцией dot по условию нельзя пользоваться.

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 21:50 
Аватара пользователя


15/01/06
200
pointXY в сообщении #282072 писал(а):
Спасибо))
A={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} пробовал - неполучалось цикл зделать. Мне нужна процедура, которая перемножает две любые матрицы размером 3х3, у меня значения этих матриц задаются вначале и дальше процедура. А функцией dot по условию нельзя пользоваться.


Ну если бы вы писали в своих циклах что-то типа С[[i,j]]=С[[i,j]]+A[[i, k]]*B[[k, j]], то все бы работало и с такой формой записи A={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, только матрицу C надо было бы определять как 3 на 3 с нулевыми элементами.

 Профиль  
                  
 
 Re: Процедура в Mathematica
Сообщение20.01.2010, 22:33 


28/10/08
33
Leierkastenmann спасибо за помощ.

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

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



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

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


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

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