From help-request at octave dot org Fri Feb 18 13:33:25 2005 Subject: Re: C++ using Octave headers, mkoctfile From: "Steve C. Thompson" To: Francesco Potorti` Cc: help at octave dot org Date: Fri, 18 Feb 2005 11:36:10 -0800 > Perhaps, before trying to produce C++ code, you should try to learn how > to use Octave's vector abilities at their best. For example, the code > you wrote can be vectorialised as: > > N=30; W=exp(j*2*pi*[0:N-1]'*[1:N]/N); > > and it runs faster. You are absolutely correct. But this code snippet was to serve as an example only. Let me simplify the question: How do I return a complex number from a custom .oct file? For example, the file sct_complex_return.cc, #include #include DEFUN_DLD (sct_complex_return, args, , "Returns a complex number") { octave_value retval; Complex tmp = exp(1); return retval = tmp; } compiles to sct_complex_return.oct with the command ``mkoctfile sct_complex_return.cc''. Running ``sct_complex_return'' at the octave prompt yields octave:1> sct_complex_return ans = 2.7183 But, I want to return exp(j), which is octave:2> exp(j) ans = 0.54030 + 0.84147i Looking at octave/oct-cmplx.h: inline Complex exp (const Complex& z) { return std::exp (z); } I don't know how to take this definition and apply it to real code. Several stabes in the dark: Complex tmp = exp(1); \\ thinking the argument was assumed imaginary Complex tmp = exp(Complex& 1); \\ mimicing the expression in the header Complex tmp = exp(I); \\ this is they way you do it in standard C (I think) etc. Concerning optimizing my Octave code. I've vectorized as much as possible, but the simulation simply must perform a while loop until a certain condition is met, and this takes days. Vectorizing the code improves performance, but the algorithm can't sidestep the loop. Thanks, Steve On Feb 18 18:40PM, Francesco Potorti` wrote: > >I have learned how to generate random variables -- a big step. But I'm > >currently stuck on building a complex matrix (or returning a complex > >number). For example, what would the C++ code be to generate: > > > >n=[0:29]'; > >W=zeros(30,30); > >for k=1:30 > > W(:,k)=exp(j*2*pi*k*n/30); > >end > > Perhaps, before trying to produce C++ code, you should try to learn how > to use Octave's vector abilities at their best. For example, the code > you wrote can be vectorialised as: > > N=30; W=exp(j*2*pi*[0:N-1]'*[1:N]/N); > > and it runs faster. > > -- > Francesco Potort? (ricercatore) Voice: +39 050 315 3058 (op.2111) > ISTI - Area della ricerca CNR Fax: +39 050 313 8091 > via G. Moruzzi 1, I-56124 Pisa Email: Potorti at isti dot cnr dot it > Web: http://fly.isti.cnr.it/ Key: fly.isti.cnr.it/public.key ------------------------------------------------------------- Octave is freely available under the terms of the GNU GPL. Octave's home on the web: http://www.octave.org How to fund new projects: http://www.octave.org/funding.html Subscription information: http://www.octave.org/archive.html -------------------------------------------------------------