2014 dxdy logo

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

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




 
 For и Table в Mathematica
Сообщение14.09.2011, 13:08 
Здравствуйте. Вопрос такой. Почему заполнение таблицы с помощью For иногда занимает гораздо больше времени чем с помощью Table?

 
 
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 14:29 
Попробуйте ещё Do.

 
 
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 14:34 
Мне надо For. И вопрос именно, почему такое большое различие в скорости. Хотя Do, может быть, и подойдет. А в чем принципиальное отличие For і Do?

 
 
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 14:35 
Вообще, For и Table работают по-разному. Естественно, что из-за этого и из-за того, что для заполнения таблицы в них надо использовать разные выражения (в первой функции не обойтись без присваивания внешней переменной, к примеру, а во второй нет), время будет разным. По виду Table можно судить, что эта функция оптимизирована для создания многомерных массивов, For же более общая.

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

 
 
 
 Re: For и Table в Mathematica
Сообщение14.09.2011, 15:06 
Спасибо за ответы. Код, к примеру, вот такой. Все внутренние таблицы уже посчитаны, но сам цикл счтается долго.
Код:
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 
(Ну, при копировании обратно всё вставится «хорошо».)

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

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

 
 
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 08:07 
В принципе суть алгоритма не столь здесь важна. Факт в том, что формируются пять таблиц по уже сформированным таблицам. Т.е. в принципе все операции: обращение к элементу уже сформирванной таблицы, арифмитические операции.

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

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

 
 
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 17:30 
Андрей123 в сообщении #483218 писал(а):
просто Table в пределах одной минуты
Для заполнения таблицы таким же способом?

 
 
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 21:10 
Ну вот конкретный пример, про который я говорил:
Код:
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 
Ну так тот ваш For намного больше приведённого Table. Или не соображу никак, о чём вы.

 
 
 
 Re: For и Table в Mathematica
Сообщение15.09.2011, 22:40 
Я к тому, что если вместо Table написать For и в нем поэлементно заполнять таблицу из последнего примера, то работает он намного дольше, чем то что написано в коде. А то, что большое, это я сейчас воюю.

 
 
 
 Re: For и Table в Mathematica
Сообщение16.09.2011, 15:56 
А, это да. По причинам, которые я описал выше. Для «эквивалентного» Forа в его внутреннем выражении надо ведь присваивать переменной, делать проверки на индексы, и всё это задано в самой общей форме. Думаю, там можно оптимизировать внутренний код намного хуже, чем в Table, «специализация» которой уже. Итерация там уже происходит не с помощью вычисления выражений инкремента и проверки, а в коде ядра. Точнее сказать не могу, потому что не знаю, но примерно так должно быть.

 
 
 
 Re: For и Table в Mathematica
Сообщение16.09.2011, 23:28 
Неужели на проверку и на инкремент тратится так много времени? А Do получше будет?

 
 
 
 Re: For и Table в Mathematica
Сообщение17.09.2011, 15:45 
Андрей123 в сообщении #483606 писал(а):
Неужели на проверку и на инкремент тратится так много времени?
Это же не компилируется в машинный код. Только если в какой-нибудь высокоуровневый псевдокод. Скорость поменьше будет.

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

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


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