2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 For и Table в Mathematica
Сообщение14.09.2011, 13:08 


01/12/06
463
МИНСК
Здравствуйте. Вопрос такой. Почему заполнение таблицы с помощью For иногда занимает гораздо больше времени чем с помощью Table?

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 14:29 
Заслуженный участник


27/04/09
28128
Попробуйте ещё Do.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 14:34 


01/12/06
463
МИНСК
Мне надо For. И вопрос именно, почему такое большое различие в скорости. Хотя Do, может быть, и подойдет. А в чем принципиальное отличие For і Do?

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 14:35 
Заслуженный участник


27/04/09
28128
Вообще, For и Table работают по-разному. Естественно, что из-за этого и из-за того, что для заполнения таблицы в них надо использовать разные выражения (в первой функции не обойтись без присваивания внешней переменной, к примеру, а во второй нет), время будет разным. По виду Table можно судить, что эта функция оптимизирована для создания многомерных массивов, For же более общая.

Ну если вам надо, используйте. В чём проблемы? Если хотите, приведите свой код. Быть может, его можно оптимизировать.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 15:06 


01/12/06
463
МИНСК
Спасибо за ответы. Код, к примеру, вот такой. Все внутренние таблицы уже посчитаны, но сам цикл счтается долго.
Код:
ng = 0;
For[ll = 1, ll < Length[groups] + 1, ll++,
EE = groups[[ll]][[1]];
\[Nu] = groups[[ll]][[2]];
\[Mu] = EE/2/(1 + \[Nu]);
elements = Elements[[ll]];
u[[ll]] =
  Table[{X1[[ll]][[i]], Y1[[ll]][[i]],
    If[ll == 2, UnitStep[1 - X[[ll]][[i]]^2 - (Y[[ll]][[i]] - 11)^2],
      1] \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(j = 1\), \(Length[
        elements]\)]\((\(q[j + ng]/
           2\)/\[Mu] \((\((3 -
              4  \[Nu])\) \(\[Gamma]cij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \(F1ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] + \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \((\(\[Gamma]sij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]cij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\) + \(p[j + ng]/
           2\)/\[Mu] \((\(-\((3 -
               4  \[Nu])\)\) \
\(\[Gamma]sij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \(F1ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] - \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \((\(\[Gamma]cij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]sij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\))\)\)}, {i, 1, Length[xij[[ll]]]}];
v[[ll]] =
  Table[{X1[[ll]][[i]], Y1[[ll]][[i]],
    If[ll == 2, UnitStep[1 - X[[ll]][[i]]^2 - (Y[[ll]][[i]] - 11)^2],
      1] \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(j = 1\), \(Length[
        elements]\)]\((\(q[j + ng]/
           2\)/\[Mu] \((\((3 -
              4  \[Nu])\) \(\[Gamma]sij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \(F1ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] - \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \((\(\[Gamma]cij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]sij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\) + \(p[j + ng]/
           
           2\)/\[Mu] \((\((3 -
              4  \[Nu])\) \(\[Gamma]cij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \(F1ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] - \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)] \((\(\[Gamma]sij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]cij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\))\)\)}, {i, 1, Length[xij[[ll]]]}];
\[Sigma]XX[[ll]] =
  Table[{X1[[ll]][[i]], Y1[[ll]][[i]],
    If[InsideContour[X1[[ll]][[i]], Y1[[ll]][[i]]] > 0, \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(j = 1\), \(Length[
        elements]\)]\((q[
          j + ng] \((\(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i, j\)\(]\)] +
           2 \((1 - \[Nu])\) \
\((\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\) + \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             
             j\)\(]\)]\ \
\((\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F4ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F5ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\) +
        p[j + ng]\ \((\(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
            j\)\(]\)] - \((1 -
              2  \[Nu])\) \((\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\
\(i, j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\) + \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)]\ \
\((\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F4ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F5ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\))\)\), 0]}, {i, 1, Length[X[[ll]]]}];
\[Sigma]YY[[ll]] =
  Table[{X1[[ll]][[i]], Y1[[ll]][[i]],
    If[InsideContour[X1[[ll]][[i]], Y1[[ll]][[i]]] > 0, \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(j = 1\), \(Length[
        elements]\)]\((q[
          j + ng] \((\(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i, j\)\(]\)] -
           2 \((1 - \[Nu])\) \
\((\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\) - \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)]\ \
\((\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F4ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F5ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\) +
        p[j + ng]\ \((\(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
            j\)\(]\)] + \((1 -
              2  \[Nu])\) \((\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\
\(i, j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\) - \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             
             j\)\(]\)]\ \
\((\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F4ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F5ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\))\)\), 0]}, {i, 1, Length[X[[ll]]]}];
\[Sigma]XY[[ll]] =
  Table[{X1[[ll]][[i]], Y1[[ll]][[i]],
    If[InsideContour[X1[[ll]][[i]], Y1[[ll]][[i]]] > 0, \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(j = 1\), \(Length[
        elements]\)]\((q[
          j + ng] \((2 \((1 - \[Nu])\) \
\((\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\) + \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)]\ \
\((\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F4ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F5ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\) +
        p[j + ng]\ \((\((1 -
              2  \[Nu])\) \((\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\
\(i, j\)\(]\)] \(F2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] - \
\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F3ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\) - \(yij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
             j\)\(]\)]\ \
\((\(\[Gamma]c2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F4ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] + \
\(\[Gamma]s2ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)] \(F5ij[\([\)\(ll\)\(]\)]\)[\([\)\(i,
                j\)\(]\)])\))\))\)\), 0]}, {i, 1, Length[X[[ll]]]}];
Print[Length[elements], " ", ll, " ", ng];
ng = ng + Length[elements];
Print[Length[elements], " ", ll, " ", ng];


-- Ср сен 14, 2011 16:26:10 --

Что-то код так плохо вставился.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 16:14 
Заслуженный участник


27/04/09
28128
(Ну, при копировании обратно всё вставится «хорошо».)

Это что, всё внутренности Forа? :shock: (Из-за такой величины и несогласованной самой первой [ не могу охватить взглядом.) Немудрено, что вычисляется долго.

Это реализация какого алгоритма? А то даже не знаю, как оптимизировать, глаза разбегаются.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 08:07 


01/12/06
463
МИНСК
В принципе суть алгоритма не столь здесь важна. Факт в том, что формируются пять таблиц по уже сформированным таблицам. Т.е. в принципе все операции: обращение к элементу уже сформирванной таблицы, арифмитические операции.

Вот напрмер для одной из внутренних таблиц, если ее также заполнять с помощью For не конкретно на этом примере, но считал минут 20, в то время как просто Table в пределах одной минуты. Мне не совсем понятно почему.

Попробую еще через Do.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 17:30 
Заслуженный участник


27/04/09
28128
Андрей123 в сообщении #483218 писал(а):
просто Table в пределах одной минуты
Для заполнения таблицы таким же способом?

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 21:10 


01/12/06
463
МИНСК
Ну вот конкретный пример, про который я говорил:
Код:
A = Table[
   If[i <= pp, If[j <= pp, A11[[i, j]], A12[[i, j - pp]]],
    If[j <= pp, A21[[i - pp, j]], A22[[i - pp, j - pp]]]], {i, 1,
    2 Length[elements]}, {j, 1, 2 Length[elements]}];

Размер матріцы- 2500 на 2500.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 21:25 
Заслуженный участник


27/04/09
28128
Ну так тот ваш For намного больше приведённого Table. Или не соображу никак, о чём вы.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 22:40 


01/12/06
463
МИНСК
Я к тому, что если вместо Table написать For и в нем поэлементно заполнять таблицу из последнего примера, то работает он намного дольше, чем то что написано в коде. А то, что большое, это я сейчас воюю.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение16.09.2011, 15:56 
Заслуженный участник


27/04/09
28128
А, это да. По причинам, которые я описал выше. Для «эквивалентного» Forа в его внутреннем выражении надо ведь присваивать переменной, делать проверки на индексы, и всё это задано в самой общей форме. Думаю, там можно оптимизировать внутренний код намного хуже, чем в Table, «специализация» которой уже. Итерация там уже происходит не с помощью вычисления выражений инкремента и проверки, а в коде ядра. Точнее сказать не могу, потому что не знаю, но примерно так должно быть.

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение16.09.2011, 23:28 


01/12/06
463
МИНСК
Неужели на проверку и на инкремент тратится так много времени? А Do получше будет?

 Профиль  
                  
 
 Re: For и Table в Mathematica
Сообщение17.09.2011, 15:45 
Заслуженный участник


27/04/09
28128
Андрей123 в сообщении #483606 писал(а):
Неужели на проверку и на инкремент тратится так много времени?
Это же не компилируется в машинный код. Только если в какой-нибудь высокоуровневый псевдокод. Скорость поменьше будет.

Да, попробуйте Do. Есть, кстати, функция Timing. Если обернуть ей выражение, она возвратит список из времени его вычисления в секундах и результата вычисления. Удобно для таких проверок на скорость.

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

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



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

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


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

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