[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 13Jul2006, 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