2014 dxdy logo

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

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




 
 [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 14:01 
Для целей конкурса пытаюсь создать демонстрацию для Wolfram CDF Player-а, пока только для примитивного квадрата 8х8. В перспективе хотелось бы создать универсальную CDF-демонстрация для квадратов всех порядков от 6 до 20 с соответсвующими преобразованиями из примитивного квадрата в пандиагональный и просто для отдельной проверки пандиагональных квадратов. Первый блин как всегда комом. Внутри Manipulate грид почему-то начинает жутко тормозить и подвешивает относительно не слабый мой комп. По этой причине пришлось включить опцию ContinuousAction -> None и для пересчета надо нажимать маленькую кнопочку U в верхнем углу. Вне Manipulate квадрат почти не тормозит, и суммы считаются, и условное форматирование действует. Условное форматирование должно рисовать простые числа синим цветом, непростые - красным.

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

 
 
 
 Re: [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 15:05 
Лучше бы код загружать сюда с тегом 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 
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 
Аватара пользователя
Не читал, но осуждаю ;-)
Уверен: беда в том, что вы пытаетесь программировать в Mathematica как в каких-нибудь плюсах, со всеми этими богомерзкими If и For, то есть, в структурном, а не функциональном стиле. Оттого комп и тормозит.

 
 
 
 Re: [Mathematica] Помогите отладить Manipulate с тяжёлым Grid-ом
Сообщение06.07.2013, 19:56 
А зачем опять if в определениях $f$? Тот код что я привел, должен быть эквивалентен.

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


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