comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Re: Matrix filling methods?
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
Re: Matrix filling methods? [message #2688] Fri, 19 August 1994 07:26
steinhh is currently offline  steinhh
Messages: 260
Registered: June 1994
Senior Member
In article <3321q2$p23@sun4.bham.ac.uk>, sjt@xun8.sr.bham.ac.uk (James Tappin) writes:
|> Andy Nicholas (nicholas@dsuap1) wrote:
[..snip..]
|> : for i=0,n-1 do begin
|> : Matrix(i:*,i-1) = x(i-1)/x(k:*)
|> : Matrix(i-1,i:*) = y(k:*)/y(k-1)
|> : endfor
|> : diag=findgen(n)
|> : Matrix(diag,diag)=z(diag)
|>
|> : Does anyone know of a way to speed this up? Maybe a where to find the
|> : matrix elements above the diagonal and one for below?
|> : Any help is greatly appreciated,
|> : Thanks,
|> : Andy
|> : nicholas.uap.nrl.navy.mil
|> :
|>
|> This should be no problem provied you have enough memory for several
|> arrays of size n. Here is the way I'd do it:
|>
|> l = lindgen(n,n)
|> lc = l mod n
|> lr = l / n
|>
|> upper = lc gt lr
|> lower = lc lt lr
|>
|> Matrix = fltarr(n,n)
|> matrix(upper) = ...
|> matrix(lower) = ...
|>
|> If you need to include the diagonal then just replace gt or lt with ge or le
[..snip..]

Ahm, wouldn't the correct use of upper and lower be:

matrix = <upper-expression>*upper + <lower-expression>*lower

The lc gt lr instruction yields a matrix with zeros and ones, so
I wouldn't use it as index without also using where() around it..

Anyway, I think the multiplication method is faster -- IDL is not
very bright when it comes to optimizing memory shuffling when you
use array indexes as in matrix(where(upper)) = ....
This is performed by a relatively complex loop inside IDL, calculating
the destination address for each element, instead of swoshing the
whole thing at once.

Stein Vidar
Re: Matrix filling methods? [message #2689 is a reply to message #2688] Fri, 19 August 1994 03:33 Go to previous message
sjt is currently offline  sjt
Messages: 72
Registered: November 1993
Member
Andy Nicholas (nicholas@dsuap1) wrote:
:
: I'm trying to speed up some code and hence I am trying
: to get rid of some FOR loops. I need to fill a 2-d square
: matrix. The values above the diagonal are given by one
: formula while those values below the diagonal are given
: by another. this is how i currently fill the matrix:


: for i=0,n-1 do begin
: Matrix(i:*,i-1) = x(i-1)/x(k:*)
: Matrix(i-1,i:*) = y(k:*)/y(k-1)
: endfor
: diag=findgen(n)
: Matrix(diag,diag)=z(diag)

: Does anyone know of a way to speed this up? Maybe a where to find the
: matrix elements above the diagonal and one for below?
: Any help is greatly appreciated,
: Thanks,
: Andy
: nicholas.uap.nrl.navy.mil
:

This should be no problem provied you have enough memory for several
arrays of size n. Here is the way I'd do it:

l = lindgen(n,n)
lc = l mod n
lr = l / n

upper = lc gt lr
lower = lc lt lr

Matrix = fltarr(n,n)
matrix(upper) = ...
matrix(lower) = ...

If you need to include the diagonal then just replace gt or lt with ge or le

--
James Tappin, School of Physics & Space Research
University of Birmingham
sjt@xun8.sr.bham.ac.uk
"If all else fails--read the instructions!"

O__
-- \/`
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: Matrix filling methods?
Next Topic: Multiple graphs in IDL

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Wed Oct 08 19:25:25 PDT 2025

Total time taken to generate the page: 0.00726 seconds