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

Home » Public Forums » archive » Dropped dimensions?
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
Dropped dimensions? [message #14805] Sun, 28 March 1999 00:00 Go to previous message
Craig Markwardt is currently offline  Craig Markwardt
Messages: 1869
Registered: November 1996
Senior Member
I really enjoy programming in IDL. Because of dynamic typing and
dimensioning of variables, and the inherent vector nature of most
operators, the language itself can be exceptionally powerful. I find
myself doing some very mind-twisting things with ease in IDL, which
become very difficult if I have to translate to C.

However, sometimes IDL simply drives me up the wall. No surprise,
it's a problem with IDL silently dropping the last dimension of a
vector variable. Recently we've seen it causing havoc with matrix
multiplication. Here's another example:

Goal: use TOTAL to total one dimension in an array, A. A is three
dimensional, but can have any dimensions (ie, it can even be 1x1x1).
Typically I want to total the last dimension of the three.

ATTEMPT 1: *******************************************
A = DBLARR(N1, N2, N3)
... processing ...
TOT = TOTAL(A, 2)

ANALYSIS: Looks good right? Wrong, because IDL can silently drop any
number of trailing dimensions of size 1 from the array, so
occasionally the array doesn't have a third dimension to total. Okay,
we can REFORM it and try again.

ATTEMPT 2: *******************************************
A = DBLARR(N1, N2, N3)
... processing ...
A = REFORM(A, N1, N2, N3, /OVERWRITE) ; Make sure dimensions are correct
TOT = TOTAL(A, 2)

ANALYSIS: In fact, you will see this formalism a lot in my code. I
usually reform an array instinctively after I create it, just to be
sure it has the dimensions I ask for! Okay but this still has a
problem because sometimes, if A is a 1x1x1 array at the start, the
processing can leave only a scalar. Surprise again! Because REFORM()
does not accept scalars. So this is what I am left with:

ATTEMPT 3: *******************************************
A = DBLARR(N1, N2, N3)
... processing ...
IF N_ELEMENTS(A) EQ 1 THEN A = [A] ; Make sure it's an array
A = REFORM(A, N1, N2, N3, /OVERWRITE) ; Make sure dimensions are correct
TOT = TOTAL(A, 2)

ANALYSIS: Okay, this works in most cases. But it's a lot of hoops to
jump through for a simple operation.

What is the moral of the story?

For IDL programmers: you have to be very careful about where your
array variables get silently REFORMed. REFORM them yourself at
critical points.

For RSI:
* REFORM should operate on scalars too.
* TOTAL should ignore missing final dimensions, since those dimensions
can be dropped.
* Dimensions should not be dropped! I do appreciate when that happens
sometimes, but it usually happens at random and dangerous moments.
I would like to have explicit control over when it happens. Something
like a RELAX procedure which "relaxes" unneeded final dimensions.

Thanks for staying with me on this tirade. Back to shiny happy
thoughts now.

Craig


--
------------------------------------------------------------ --------------
Craig B. Markwardt, Ph.D. EMAIL: craigmnet@astrog.physics.wisc.edu
Astrophysics, IDL, Finance, Derivatives | Remove "net" for better response
------------------------------------------------------------ --------------
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Re: overwrite output to screen; unix vs windows
Next Topic: plotting an array values keeping origin as a reference value

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

Current Time: Fri Oct 10 13:38:08 PDT 2025

Total time taken to generate the page: 1.51787 seconds