help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Stupid New User Question


From: John W. Eaton
Subject: Re: Stupid New User Question
Date: Thu, 13 Jul 2006 14:34:00 -0400

On 13-Jul-2006, Muthiah Annamalai wrote:

| If you looked into the nice code in octave .m files
| which come with the distribution at 
| /usr/share/octave/$VERSION/m/scripts/
| youd get a nice idea of how to write great functions.
| 
| For making this code work with arrays you just need
| to use  the find() function.
| 
| function  retval = killnegatives(x)
| 
|      retval = x;
| 
|      %if(retval<0) retval = 0;
|      negatives=find(retval<0);
|      retval(negatives)=0;
| 
| endfunction

The find function works, but it also works to just use the mask (i.e.,
the result of the "retval < 0" expression) directly as the index: 

  function  retval = killnegatives(x)
    retval = x;
    retval(retval<0)=0;
  endfunction

This should be more efficient since it eliminates the call to find and
the extra vector of indices produced by find.  Here's some timing code
that graphs the ratio of times required for the two versions.

function r = f (x)
  r = x;
  n = find (r < 0);
  r(n) = 0;
endfunction

function r = g (x)
  r = x;
  r(r<0) = 0;
endfunction

function r = h (n, v)
  x = rand (n) - v;
  t = cputime (); f(x); tf = cputime () - t;
  t = cputime (); g(x); tg = cputime () - t;
  r = tf / tg;
endfunction

m = 20;
z = zeros (m, m);
n = logspace (log10 (500), log10 (3000), m);
v = linspace (0, 1, m);
for i = 1:m
  for j = 1:m
    z(i,j) = h (n(i), v(j));
  endfor
endfor

[x, y] = meshdom (n, v);
zlabel ("find / logical indexing");
xlabel ("matrix size")
ylabel ("approx frac of neg vals")
mesh (x, y, z);

When I run this with the current 2.9.x sources, the find solution is
always slower.  So if there are any functions in the Octave sources
that still use find instead of logical indexing for this kind of
operation, I think we should eliminate the calls to find.

Thanks,

jwe


reply via email to

[Prev in Thread] Current Thread [Next in Thread]