2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 14:01 


16/08/05
1153
Для целей конкурса пытаюсь создать демонстрацию для Wolfram CDF Player-а, пока только для примитивного квадрата 8х8. В перспективе хотелось бы создать универсальную CDF-демонстрация для квадратов всех порядков от 6 до 20 с соответсвующими преобразованиями из примитивного квадрата в пандиагональный и просто для отдельной проверки пандиагональных квадратов. Первый блин как всегда комом. Внутри Manipulate грид почему-то начинает жутко тормозить и подвешивает относительно не слабый мой комп. По этой причине пришлось включить опцию ContinuousAction -> None и для пересчета надо нажимать маленькую кнопочку U в верхнем углу. Вне Manipulate квадрат почти не тормозит, и суммы считаются, и условное форматирование действует. Условное форматирование должно рисовать простые числа синим цветом, непростые - красным.

Всем, кто знаком с Математикой и заинтересуется данной задачей - буду рад любым советам по отладке этого кода.

 Профиль  
                  
 
 Re: [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 15:05 
Заслуженный участник


25/02/11
1797
Лучше бы код загружать сюда с тегом Code.
Не разбирался с тем, что программа делает, но могу сказать, что быстродействие можно насколько-то повысить, более эффективно определяя свои функции. А для вычислений лучше использовать встроенные, где возможно. Для следа есть команда Tr, например: S = Tr@T.
Функцию $f$ можно задать, скажем, так:
Код:
f[1, 1] = a11; f[1, 2] = a12; f[1, 3] = a13; f[1, 4] = a14;
f[1, 5] = a15;
f[2, 1] = a21; f[3, 1] = a31; f[4, 1] = a41; f[5, 1] = a51;
f[1, y_] := f[1, 1] + f[1, 5] - f[1, y - 4];
f[x_, 1] := f[1, 1] + f[5, 1] - f[x - 4, 1];
f[x_, y_] := f[x, y - 1] + f[x - 1, y] - f[x - 1, y - 1] ;

Должно быть побыстрее, чем много if. Еще быстродействие может зависеть от того, насколько большими получаются элементы символьной матрицы $T$.

 Профиль  
                  
 
 Re: [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 15:48 


16/08/05
1153
Vince Diesel
Спасибо.

Текущий код:
Код:
Manipulate[
f[x_, y_] := (
   If[x == 1 && y == 1, Return[a11]];
   If[x == 1 && y == 2, Return[a12]];
   If[x == 1 && y == 3, Return[a13]];
   If[x == 1 && y == 4, Return[a14]];
   If[x == 1 && y == 5, Return[a15]];
   If[x == 2 && y == 1, Return[a21]];
   If[x == 3 && y == 1, Return[a31]];
   If[x == 4 && y == 1, Return[a41]];
   If[x == 5 && y == 1, Return[a51]];
   If[x == 1 && 5 < y < 9, Return[f[1, 1] + f[1, 5] - f[1, y - 4]]];
   If[y == 1 && 5 < x < 9, Return[f[1, 1] + f[5, 1] - f[x - 4, 1]]];
   If[1 < x < 9 && 1 < y < 9, Return[f[x, y - 1] + f[x - 1, y] - f[x - 1, y - 1]]]
   );
U = Table[, {64}];
For[i = 1, i < 9, i++,
  For[j = 1, j < 9, j++, If[PrimeQ[T[[i, j]]], V = Blue, V = Red];
   U[[j + 8 (i - 1)]] = {i, j} -> V]];
T = Table[f[i, j], {i, 8}, {j, 8}];
S = 0; For[k = 1, k < 9, k++, S = S + T[[k, k]]];
Grid[{{,
    Grid[Table[Sum[T[[i, j]], {8}], {i, 1}, {j, 8}], Frame -> All,
     FrameStyle -> Gray, ItemSize -> All,
     Spacings -> {2, 2}],}, {Grid[
     Table[Sum[T[[i, j]], {8}], {i, 8}, {j, 1}], Frame -> All,
     FrameStyle -> Gray, ItemSize -> All, Spacings -> {2, 2}],
    Grid[T, Frame -> All, ItemSize -> All, Spacings -> {2, 2},
     ItemStyle -> {Automatic, Automatic, U},
     Background -> {None, None, {{{1, 5}, {1, 1}} -> LightYellow, {{1, 1}, {1, 5}} -> LightYellow}}],
    Grid[Table[S, {8}, {1}], Frame -> All, FrameStyle -> Gray,
     ItemSize -> All, Spacings -> {2, 2}]}, {,
    Grid[Table[S, {1}, {8}], Frame -> All, FrameStyle -> Gray,
     ItemSize -> All, Spacings -> {2, 2}],}}],
{{a11, 3, "A(1,1)"}, 1, 10000, 1, Appearance -> "Open"},
{{a12, 3, "A(1,2)"}, 1, 10000, 1, Appearance -> "Open"}, {{a13, 3, "A(1,3)"}, 1, 10000, 1, Appearance -> "Open"},
{{a14, 3, "A(1,4)"}, 1, 10000, 1, Appearance -> "Open"}, {{a15, 3, "A(1,5)"}, 1, 10000, 1, Appearance -> "Open"},
{{a21, 3, "A(2,1)"}, 1, 10000, 1, Appearance -> "Open"}, {{a31, 3, "A(3,1)"}, 1, 10000, 1, Appearance -> "Open"},
{{a41, 3, "A(4,1)"}, 1, 10000, 1, Appearance -> "Open"}, {{a51, 3, "A(5,1)"}, 1, 10000, 1, Appearance -> "Open"},
ControlPlacement -> Left, ContinuousAction -> None]

 Профиль  
                  
 
 Re: [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 18:47 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Не читал, но осуждаю ;-)
Уверен: беда в том, что вы пытаетесь программировать в Mathematica как в каких-нибудь плюсах, со всеми этими богомерзкими If и For, то есть, в структурном, а не функциональном стиле. Оттого комп и тормозит.

 Профиль  
                  
 
 Re: [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 19:56 
Заслуженный участник


25/02/11
1797
А зачем опять if в определениях $f$? Тот код что я привел, должен быть эквивалентен.

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

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



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

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


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

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