help-octave
[Top][All Lists]

Re: a=0; a([1,1])++ -> a == 2

 From: Dirk Laurie Subject: Re: a=0; a([1,1])++ -> a == 2 Date: Thu, 3 Aug 2000 08:46:55 +0200

```Etienne Grossmann skryf:
>
>   Hello,
>
>   sorry if the answer to my question is a clear-cut "no" or if it has
>
>   Wouldn't it make sense to have the code
>
>        a=0; b = a([1,1])++ ;
>
>   be equivalent to either
>
>        a=0; b=a([1,1]); b++; for i in [1,1], a(i)++ ; end
>
>        yielding       a == 2, b == [1;1]
>   or
>        a=0; b=zeros(size(a)); for i in [1,1], b(i) = a(i)++ ; end
>
>        yielding       a == 2, b == [1;2]
>
The ++ operator is inherited from C, and it would be highly confusing,
to say the least, if the behaviour should be different from that of C.
So the code

a=0; b = a([1,1])++ ;

should be equivalent to

a=0; b=a([1,1]); a([1,1])=a([1,1])+1;

whereas

a=0; b = ++a([1,1]) ;

should be equivalent to

a=0; a([1,1])=a([1,1])+1; b=a([1,1]);

Therefore in the first case, an experienced C programmer would expect

a == 1; b == [0;0];

and in the second

a == 1; b == [1;1];

This is indeed what Octave 2.1.30 delivers.

If you need to vectorize

for k in I, a(k)++; end

to work also when there are repeated indices, you could use

J=sort(I);
k=find([1,diff(J)]);
a(J(k))=diff([k,length(J)+1]);

Dirk

-----------------------------------------------------------------------
Octave is freely available under the terms of the GNU GPL.

Octave's home on the web:  http://www.che.wisc.edu/octave/octave.html
How to fund new projects:  http://www.che.wisc.edu/octave/funding.html
Subscription information:  http://www.che.wisc.edu/octave/archive.html
-----------------------------------------------------------------------

```