[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Help-octave Digest, Vol 111, Issue 27
From: |
Maynard Wright |
Subject: |
Re: Help-octave Digest, Vol 111, Issue 27 |
Date: |
Wed, 10 Jun 2015 06:36:46 -0700 |
User-agent: |
KMail/1.13.5 (Linux/2.6.35-22-generic; KDE/4.5.5; i686; ; ) |
On Wednesday, June 10, 2015 06:06:48 am Dave Cottingham wrote:
> > ---------- Forwarded message ----------
> > From: Vic Norton <address@hidden>
> > To: help-octave Octave <address@hidden>
> > Cc:
> > Date: Wed, 10 Jun 2015 07:03:03 -0400
> > Subject: Re: a try-if construction
> >
> > On Jun 9, 2015, at 5:32 PM, Vic Norton <address@hidden> wrote:
> > > The perl code
> > >
> > > my @K= qw( 1 30 48 );
> > > my $n = 109;
> > > my ($k0, $k1);
> > > my $i = 0;
> > > for (my $i = 0; $i < @K; $i++) {
> > >
> > > $k0 = $K[$i];
> > > unless ($k1 = $K[$i + 1]) { $k1 = $n }
> > > printf("i = %d, k0 = %d, k1 = %d\n", $i + 1, $k0, $k1);
> > >
> > > }
> > >
> > > and the octave code
> > >
> > > K = [ 1 30 48 ];
> > > n = 109;
> > > for i = 1 : length(K)
> > >
> > > k0 = K(i);
> > > try k1 = K(i + 1); end
> > > if k1 == k0; k1 = n; endif
> > > printf("i = %d, k0 = %d, k1 = %d\n", i, k0, k1);
> > >
> > > endfor
> > >
> > > produce exactly the same results:
> > > i = 1, k0 = 1, k1 = 30
> > > i = 2, k0 = 30, k1 = 48
> > > i = 3, k0 = 48, k1 = 109
> > >
> > > I am very comfortable with the "unless" line in perl. I am much less
> >
> > comfortable with the "try-if" lines in octave. Is this "try-if
> > construction the best way to do what I want to do?
> >
> > On Jun 10, 2015, at 3:53 AM, JokerOne <
> >
> > address@hidden> wrote:
> > > Hi Vic,
> > >
> > > to be honest, I do not fully understand what you actually want to do?
> > >
> > > For the output you got, maybe something like that is more
> >
> > straightforward?
> >
> > > K = [ 1 30 48 ];
> > > n = 109;
> > > K_helper = [K,n]; % "attach" n to K
> > >
> > > for i = 1 : (length(K_helper)-1)
> > >
> > > k0 = K_helper(i);
> > > k1 = K_helper(i+1);
> > > printf("i = %d, k0 = %d, k1 = %d\n", i, k0, k1);
> > >
> > > endfor
> >
> > I guess I wasn't very clear. Suppose you have a list of "actions" you
> > want to take and a default action in case one or more of the actions is
> > impossible. In Perl you simply run through the list, taking the default
> > action UNLESS you CAN take the listed action.
> >
> > How do I do the same thing in Octave? I want to TRY each action and, if I
> > CAN'T take it, take the default. The Perl mechanism is extremely simple
> > and logical. Is there a simple and logical Octave mechanism to implement
> > this process?
> >
> > Now I think I've answered my question. The following TRY-IF Octave
> > construction seems to duplicate the Perl mechanism.
> >
> > K = [ 1 30 48 ];
> > n = 109;
> > for i = 1 : length(K)
> >
> > k0 = K(i);
> > k1 = n; % take the default action
> > try k1 = K(i + 1); end % unless the action works
> > printf("i = %d, k0 = %d, k1 = %d\n", i, k0, k1);
> >
> > endfor
> >
> > with the output
> >
> > i = 1, k0 = 1, k1 = 30
> > i = 2, k0 = 30, k1 = 48
> > i = 3, k0 = 48, k1 = 109
>
> I think what you have in mind could be done by including the "catch" clause
> of the try-catch statement.
>
> try
> ... some statements here, if they hit an error then ...
> catch
> ... these statements get executed ...
> end_try_catch
>
> Not sure what the intent of that Perl construction is, but octave's
> try-catch is aimed at exception handling. Still, it does what you want (if
> I understand what you want).
>
> - Dave Cottingham
Maybe the switch statement with cases and a default to "otherwise" would work
for you. I've not used it in Octave, but used it to good effect in C some
decades ago.
Maynard Wright