[comp.sys.handhelds] HP48 Vectors to Array?

ppetto@NCoast.ORG (Peter Petto) (03/09/91)

An HP-48SX question ... I would like to combine two vectors
into an array as follows

     [ 2 4 6 8 ]  plus  [ 2 9 27 81 ]

                 to get

             [[ 2 4 6 8 ]
              [ 3 9 27 81 ]]

I have been able to do this manually (via the MatrixWriter
application) but not under progam control.  Can anyone offer
any advice?  (Thanks.)

---
Peter Petto        |     ppetto@ncoast.org
Bay Village, Ohio  |  73125.617@compuserve.com

bson@fruit-and-fibre.ai.mit.edu (Jan Brittenson) (03/09/91)

In a posting of [8 Mar 91 21:10:04 GMT]
   ppetto@NCoast.ORG (Peter Petto) writes:

 >An HP-48SX question ... I would like to combine two vectors
 >into an array as follows
 >
 >     [ 2 4 6 8 ]  plus  [ 2 9 27 81 ]
 >
 >                 to get
 >
 >             [[ 2 4 6 8 ]
 >              [ 3 9 27 81 ]]
 
How about:

<< SWAP ARRY-> LIST-> DROP 
    DUP 2 + ROLL ARRY-> LIST-> DROP
    DUP 2 + ROLL + 2 SWAP OVER / OVER
    ->LIST ->ARRY
>>

Assuming the sum of the vector sizes is even.

						-- Jan Brittenson
						   bson@ai.mit.edu

					   Read my lisp: no new classes!

rouben@math13.math.umbc.edu (Rouben Rostamian) (03/10/91)

In article <13845@life.ai.mit.edu> bson@fruit-and-fibre.ai.mit.edu (Jan Brittenson) writes:
@ In a posting of [8 Mar 91 21:10:04 GMT]
@    ppetto@NCoast.ORG (Peter Petto) writes:
@ 
@  >An HP-48SX question ... I would like to combine two vectors
@  >into an array as follows
@  >
@  >     [ 2 4 6 8 ]  plus  [ 2 9 27 81 ]
@  >
@  >                 to get
@  >
@  >             [[ 2 4 6 8 ]
@  >              [ 3 9 27 81 ]]
@  
@ How about:
@ 
@ << SWAP ARRY-> LIST-> DROP 
@     DUP 2 + ROLL ARRY-> LIST-> DROP
@     DUP 2 + ROLL + 2 SWAP OVER / OVER
@     ->LIST ->ARRY
@ >>

Here is a somewhat shorter version (53 bytes compared to 73) of the
program above:

Checksum: #23189d
Bytes:         53

<< SWAP OBJ-> OBJ-> DROP 1 + ROLL
	OBJ-> OBJ-> DROP 2 SWAP
	2 ->LIST ->ARRY
>>

--
Rouben Rostamian                          Telephone: (301) 455-2458
Department of Mathematics and Statistics  e-mail:
University of Maryland Baltimore County   bitnet: rostamian@umbc.bitnet
Baltimore, MD 21228,  U.S.A.              internet: rouben@math9.math.umbc.edu

jurjen@cwi.nl (Jurjen NE Bos) (03/11/91)

In a posting of [8 Mar 91 21:10:04 GMT]
   ppetto@NCoast.ORG (Peter Petto) writes:

>An HP-48SX question ... I would like to combine two vectors
>into an array as follows
>
>     [ 2 4 6 8 ]  plus  [ 2 9 27 81 ]
>
>                 to get
>
>             [[ 2 4 6 8 ]
>              [ 3 9 27 81 ]]

This is one of the more useful functions of \GS+ (\GS means the capital sigma)
how about?
\<< CL\GS SWAP \GS+ \GS+ RCL\GS \>>
It this short, or what?
There is one problem: it doesn't work with complex numbers.
Happy Hacking, 

TDSTRONG%MTUS5.BITNET@VM1.NoDak.EDU (Tim Strong) (03/12/91)

>
>In a posting of [8 Mar 91 21:10:04 GMT]
>   ppetto@NCoast.ORG (Peter Petto) writes:
>
>>An HP-48SX question ... I would like to combine two vectors
>>into an array as follows
>>
>>     [ 2 4 6 8 ]  plus  [ 2 9 27 81 ]
>>
>>                 to get
>>
>>             [[ 2 4 6 8 ]
>>              [ 3 9 27 81 ]]
>
>This is one of the more useful functions of \GS+ (\GS means the capital sigma)
>how about?
>\<< CL\GS SWAP \GS+ \GS+ RCL\GS \>>
>It this short, or what?
>There is one problem: it doesn't work with complex numbers.
>Happy Hacking,


How about
CATARRY
<< OBJ-> 1 GET DROP 1 + ROLL OBJ-> 2 SWAP + ->ARRY >>

Longer and not exactly elegant but it should work for complex arrays.
It also has a deficiency in that it can't continue concatenating arrays
to vectors.  For example one's next step might be:

[[ 2 4 6 8 ]
 [ 2 9 27 81 ]]

[ 4 5 8 6 ]
CATARRY

hoping for

[[ 2 4 6 8 ]
 [ 2 9 27 81 ]
 [ 4 5 8 6 ]]

But it will probably give you a mess on the stack along with a two row array.
I'm not sure my calculator ain't here so I can't check what happens but it will
screw up.  If I had my calculator I'm sure that with some work the above
routine could be reworked to fix the problem.

seroussi@hplred.HP.COM (Gadiel Seroussi) (03/13/91)

I've been using the following "off the wall" programs for converting
a set of vectors to a matrix and vice versa:

V2MX:
----
Takes an integer n from level 1, and n vectors from levels  2..(n+1),
and produces a n-row matrix (works for reals and complexes, and doesn't mess up
your statistics):
\<<
  \->LIST \->STR 1 "[" REPL DUP SIZE  "]" REPL OBJ\->
\>>

MX2V:
-----
Does the inverse of V2MX:

\<<
  DEPTH \-> d
  \<<
    \->STR DUP SIZE 1 - 2 SWAP SUB OBJ\-> DEPTH d
    - 1 +
  \>>
\>>

I'll leave it to others to optimize and squeeze the last nibble out 
of the above.

Gadiel Seroussi
HP Labs

jmorriso@ee.ubc.ca (John Paul Morrison) (03/15/91)

Well, here is yet another vector to array type of program. 
I use it extensively. It works on both HP28S and HP48SX machines.
It is quick, as it uses the stack.

A2V

@ Extracts the COLUMN vectors of a matrix
@ Hit TRN first if you want the ROW vectors
@ leaves them on the stack, whith the number of vectors in level 1

%%HP: T(3)A(D)F(.);
\<< TRN ARRY\-> LIST\->
DROP DUP 1 - NEG \->
n m m1
  \<< m n 1 - * 1 + n
    FOR i m \->ARRY i
ROLLD m1
    STEP n
  \>>
\>>

V2A

@ The inverse of A2V
@ Takes n vectors, and the number n and leaves a matrix on the stack

%%HP: T(3)A(D)F(.);
\<< OVER SIZE 1 GET
DUP 1 - \-> n m m1
  \<< n m n 1 - * 1 +
    FOR i i ROLL
ARRY\-> DROP m1
    STEP { n m }
\->ARRY TRN
  \>>
\>>

If you're really picky, these do not work for 1 dimesional vectors or n * 1
matrices. Big deal. One dimesional vectors are SCALARs anyways.
The bug is in the HP STUPID_FOR loop. I'll fix it when I need the extra
"correctness".
In case you haven't noticed, HP STUPID_FOR loops ALWAYS execute at least
once. I know that's
documented, but it's still STUPID (especially if you program in C).