Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have some code inside a Manipulate, whose goal is to allow the user to edit the upper half of the matrix while keeping it symmetric at all time. The minimal code is the following:

Manipulate[
 Refresh[
    i = i + 1;
    Do[Cmat[[i, j]] = Cmat[[j, i]], {i, 2, 6}, {j, 1, i - 1}];
  , TrackedSymbols -> {Cmat}];
 {i, Grid[Array[InputField[Dynamic[Cmat[[#1, #2]]], FieldSize -> 5, Enabled -> #1 <= #2] &, {6, 6}]]}
 ,
 Initialization :> (
   i = 0;
   Cmat = ConstantArray[0, {6, 6}];
   )]

I added the i variable as a counter, and I expected it to be only incremented when I actually change the value of one of the Cmat elements. What actually happens is that i increases near the speed of the runloop, and that code actually hogs the CPU (one core of it, anyway). I suppose what happens is that the modification of the tracked value inside Refresh actually triggers Refresh itself, hence the loop.

How can I prevent this? I thought restricting TrackedSymbols to the upper half of Cmat would do the trick, but it changes nothing. Is there a way, inside of Refresh, to change Cmat without it being tracked? The opposition functionality exists, in the form of Update.

share|improve this question

2 Answers 2

Why Refresh? The second argument of Dynamic is your friend:

DynamicModule[
  {Cmat = ConstantArray[0, {6, 6}]}, 
 Deploy@Panel@Grid[Array[Function[{m, n}, 
      InputField[Dynamic[Cmat[[m,n]], 
        (Cmat[[m,n]] = #1; 
          Cmat[[n,m]] = #1) & ], 
       Number, FieldSize -> 5, 
       Enabled -> m <= n, 
       ContinuousAction -> True]], 
     {6, 6}]]]
share|improve this answer
    
Yes, I can do it like that, I forgot about it… I like the Refresh construct, though, and I'd like even better to understand how to make it work. Any idea? –  F'x Nov 12 '12 at 15:06

Why do you say Update has the opposite functionality? Perhaps what you want is something like this, changing your code minimally

Manipulate[Refresh[i = i + 1;
  Do[Cmat[[i, j]] = Cmat[[j, i]], {i, 2, 6}, {j, 1, i - 1}];, 
  None]; Cmat;
 {i, Grid[
   Array[InputField[Dynamic[Cmat[[#1, #2]]], FieldSize -> 5, 
      Enabled -> #1 <= #2] &, {6, 6}]]}, Initialization :> (i = 0;
   Cmat = ConstantArray[0, {6, 6}];)]
share|improve this answer
    
Nope, doesn't work. If you switch focus out and back in the matrix, your counter starts to increment like crazy! –  F'x Nov 12 '12 at 19:43
    
@F'x I'm trying to reproduce that but so far I couldn't! –  Rojo Nov 12 '12 at 20:23
    
This works fine as long as I don't hit the [enter] key after entering a value (as one is tempted to do when entering digits from the numeric keypad). At least on my system, I get two copies of the panel and a runaway counter if I hit [enter] as opposed to [return]. –  m_goldberg Nov 12 '12 at 20:46
    
@m_goldberg, I think that issue has it's own question already. You don't get that problem when hitting enter with the original solution? –  Rojo Nov 12 '12 at 22:41
    
@Rojo: I didn't mean to imply that the problem was peculiar to your answer. It is more general -- it seems occur with most if not all dynamic output cells. Can you give me a link to where this has been discussed before? I'd be interested in reading that discussion. –  m_goldberg Nov 13 '12 at 1:25

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.