comp.lang.ada
 help / color / mirror / Atom feed
* Slice from a matrix?
@ 2003-05-23  9:14 Harald Schmidt
  2003-05-23 10:52 ` Dale Stanbrough
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Harald Schmidt @ 2003-05-23  9:14 UTC (permalink / raw)


Hi,

I got a generic matrix / vector package like this:

Generic
    rows : positive;
    cols : positive;
    item_type is digits <>;
Package matrix is
    type vector_type is array (positive range <>) of item_type;
    type matrix_type is array (positive range <>,
                               positive range <>) of item_type;
    subtype col_vector is vector_type(1..cols);
    subtype row_vector is vector_type(1..rows);
    subtype matrix is matrix_type(1..rows, 1..cols);
...
End matrix;

Then I have three Put procedures, one for matrix, one for row_vector, and
one for col_vector.

My question is how to get a slice from a matrix which I can convert to a
col_vector which does the printing?

Things like...

    PUT (col_vector(M (1, 1..3)));

doesn't work.

I don't want to copy code for the printing routines.

Thanks for any help,

Harald




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23  9:14 Slice from a matrix? Harald Schmidt
@ 2003-05-23 10:52 ` Dale Stanbrough
  2003-05-23 11:23 ` David C. Hoos
  2003-05-23 17:56 ` Stephen Leake
  2 siblings, 0 replies; 9+ messages in thread
From: Dale Stanbrough @ 2003-05-23 10:52 UTC (permalink / raw)


 Harald Schmidt <harald.schmidt@anobject.net> wrote:


> My question is how to get a slice from a matrix which I can convert to a
> col_vector which does the printing?
> 
> Things like...
> 
>     PUT (col_vector(M (1, 1..3)));
> 
> doesn't work.
> 

You can only take slices from 1d arrays.

dale



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23  9:14 Slice from a matrix? Harald Schmidt
  2003-05-23 10:52 ` Dale Stanbrough
@ 2003-05-23 11:23 ` David C. Hoos
  2003-05-23 14:15   ` P S Norby
  2003-05-23 18:13   ` Georg Bauhaus
  2003-05-23 17:56 ` Stephen Leake
  2 siblings, 2 replies; 9+ messages in thread
From: David C. Hoos @ 2003-05-23 11:23 UTC (permalink / raw)



"Harald Schmidt" <harald.schmidt@anobject.net> wrote in message
news:BAF3B30D.3023%harald.schmidt@anobject.net...
> Hi,
>
> I got a generic matrix / vector package like this:
>
> Generic
>     rows : positive;
>     cols : positive;
>     item_type is digits <>;
> Package matrix is
>     type vector_type is array (positive range <>) of item_type;
>     type matrix_type is array (positive range <>,
>                                positive range <>) of item_type;
>     subtype col_vector is vector_type(1..cols);
>     subtype row_vector is vector_type(1..rows);
>     subtype matrix is matrix_type(1..rows, 1..cols);
> ...
> End matrix;
>
> Then I have three Put procedures, one for matrix, one for row_vector, and
> one for col_vector.
>
> My question is how to get a slice from a matrix which I can convert to a
> col_vector which does the printing?
>
> Things like...
>
>     PUT (col_vector(M (1, 1..3)));
>
> doesn't work.
>
> I don't want to copy code for the printing routines.
Since slices in ada can only be taken from one-dimensional arrays, you
would need to declare your matrix as an array of vectors.
Individual elements are then accessed by matrix (m}{n}.

Incidentally, shouldn't a vector which is indexed by row be a column vector,
and a vector which is indexed by column be a row vector?
>
> Thanks for any help,
>
> Harald
>
> _______________________________________________
> comp.lang.ada mailing list
> comp.lang.ada@ada.eu.org
> http://ada.eu.org/mailman/listinfo/comp.lang.ada
>
>





^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23 11:23 ` David C. Hoos
@ 2003-05-23 14:15   ` P S Norby
  2003-05-24 23:00     ` Robert I. Eachus
  2003-05-23 18:13   ` Georg Bauhaus
  1 sibling, 1 reply; 9+ messages in thread
From: P S Norby @ 2003-05-23 14:15 UTC (permalink / raw)



"David C. Hoos" <david.c.hoos.sr@ada95.com> wrote in message
news:Cmnza.38775$l66.3829@fe10.atl2.webusenet.com...
>
> "Harald Schmidt" <harald.schmidt@anobject.net> wrote in message
> news:BAF3B30D.3023%harald.schmidt@anobject.net...
> > Hi,
> >
> > I got a generic matrix / vector package like this:
> >
> > Generic
> >     rows : positive;
> >     cols : positive;
> >     item_type is digits <>;
> > Package matrix is
> >     type vector_type is array (positive range <>) of item_type;
> >     type matrix_type is array (positive range <>,
> >                                positive range <>) of item_type;
> >     subtype col_vector is vector_type(1..cols);
> >     subtype row_vector is vector_type(1..rows);
> >     subtype matrix is matrix_type(1..rows, 1..cols);
> > ...
> > End matrix;
> >
> > Then I have three Put procedures, one for matrix, one for row_vector,
and
> > one for col_vector.
> >
> > My question is how to get a slice from a matrix which I can convert to a
> > col_vector which does the printing?
> >
> > Things like...
> >
> >     PUT (col_vector(M (1, 1..3)));
> >
> > doesn't work.
> >
> > I don't want to copy code for the printing routines.
> Since slices in ada can only be taken from one-dimensional arrays, you
> would need to declare your matrix as an array of vectors.
> Individual elements are then accessed by matrix (m}{n}.
>

The trouble then is that you can either have rows of columns, in which case
you can take a slice of a column, but not a slice of a row... or you can
have columns of rows, in which case you can take a slice of a row, but not a
slice of a  column.  The col_vector and row_vector are not subtypes of
matrix_type.


> Incidentally, shouldn't a vector which is indexed by row be a column
vector,
> and a vector which is indexed by column be a row vector?

Yes.  Might want to make them type-safe.

My simple solution would be to have a "Put_Item (item : in item_type);"
routine (add other parameters as desired), then declare something like

      procedure Put_Column (Mat : in Matrix_type; in_col : in cols;
from_row, to_row: in rows);

and similalry to print rows or matrix.  Your "PUT (col_vector(M (1,
1..3)));" becomes

 Put_Column (M, 1, 1, 3);

or    Put_Column (Mat => M, in_col => 1, From_row =>1, to_row => 3);   if
you prefer named notation.

These "put" routines could be in your generic or elsewhere.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23  9:14 Slice from a matrix? Harald Schmidt
  2003-05-23 10:52 ` Dale Stanbrough
  2003-05-23 11:23 ` David C. Hoos
@ 2003-05-23 17:56 ` Stephen Leake
  2003-05-23 20:03   ` Simon Wright
  2 siblings, 1 reply; 9+ messages in thread
From: Stephen Leake @ 2003-05-23 17:56 UTC (permalink / raw)


Harald Schmidt <harald.schmidt@anobject.net> writes:

> I got a generic matrix / vector package like this:
> 
> <snip>
> 
> Then I have three Put procedures, one for matrix, one for row_vector, and
> one for col_vector.
> 
> My question is how to get a slice from a matrix which I can convert to a
> col_vector which does the printing?

If you change your matrix to be an array of arrays, you can use the
Generic_Array_Text_IO package from Auto_Text_IO at
http://www.toadmail.com/~ada_wizard/auto_text_io.html.

It supports both Put and Get, with optional named association.

-- 
-- Stephe



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23 11:23 ` David C. Hoos
  2003-05-23 14:15   ` P S Norby
@ 2003-05-23 18:13   ` Georg Bauhaus
  1 sibling, 0 replies; 9+ messages in thread
From: Georg Bauhaus @ 2003-05-23 18:13 UTC (permalink / raw)


David C. Hoos <david.c.hoos.sr@ada95.com> wrote:
: "Harald Schmidt" <harald.schmidt@anobject.net> wrote in message
:>   [...]
:> Package matrix is
:>     type vector_type is array (positive range <>) of item_type;
:>     type matrix_type is array (positive range <>,
:>                                positive range <>) of item_type;
:>     subtype col_vector is vector_type(1..cols);
:>     subtype row_vector is vector_type(1..rows);
:>     subtype matrix is matrix_type(1..rows, 1..cols);
:> ...
:> End matrix;
:> My question is how to get a slice from a matrix which I can convert to a
:> col_vector which does the printing?
:>

: Since slices in ada can only be taken from one-dimensional arrays, you
: would need to declare your matrix as an array of vectors.
: Individual elements are then accessed by matrix (m}{n}.

Wouldn't this be a good opportunity to hide the implementation of
both vector_type and matrix_type, declare the needed subprograms
in the matrix spec, and use whatever combination of data "layout"
and algorithms seem appropriate to implement access to columns,
rows, and cells?



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23 17:56 ` Stephen Leake
@ 2003-05-23 20:03   ` Simon Wright
  2003-05-23 21:06     ` Stephen Leake
  0 siblings, 1 reply; 9+ messages in thread
From: Simon Wright @ 2003-05-23 20:03 UTC (permalink / raw)


Stephen Leake <Stephe.Leake@nasa.gov> writes:

> If you change your matrix to be an array of arrays, you can use the
> Generic_Array_Text_IO package from Auto_Text_IO at
> http://www.toadmail.com/~ada_wizard/auto_text_io.html.

http://www.toadmail.com/~ada_wizard/ada/auto_text_io.html



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23 20:03   ` Simon Wright
@ 2003-05-23 21:06     ` Stephen Leake
  0 siblings, 0 replies; 9+ messages in thread
From: Stephen Leake @ 2003-05-23 21:06 UTC (permalink / raw)


Simon Wright <simon@pushface.org> writes:

> Stephen Leake <Stephe.Leake@nasa.gov> writes:
> 
> > If you change your matrix to be an array of arrays, you can use the
> > Generic_Array_Text_IO package from Auto_Text_IO at
> > http://www.toadmail.com/~ada_wizard/auto_text_io.html.
> 
> http://www.toadmail.com/~ada_wizard/ada/auto_text_io.html

Arrgh. Sorry. "always check the link", same as "always compile the
example" :).
-- 
-- Stephe



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Slice from a matrix?
  2003-05-23 14:15   ` P S Norby
@ 2003-05-24 23:00     ` Robert I. Eachus
  0 siblings, 0 replies; 9+ messages in thread
From: Robert I. Eachus @ 2003-05-24 23:00 UTC (permalink / raw)


P S Norby wrote:

> The trouble then is that you can either have rows of columns, in which case
> you can take a slice of a column, but not a slice of a row... or you can
> have columns of rows, in which case you can take a slice of a row, but not a
> slice of a  column.  The col_vector and row_vector are not subtypes of
> matrix_type.

Not that I would ever throw this at a compiler  but this is not true.

Let's define three types, a "conventional" Ada two-dimensional array, a 
derived type from that type which uses Fortran (row major) layout. 
Finally a vector of vectors type that can be sliced, and which can be 
mapped to the other two types using Unchecked_Conversion.

Will it work in GNAT?  I think so.

Do I think it is a good idea?  Hell no.

I'd much rather define Row and Column functions for the two dimensional 
array type.  Three or four lines of code each, and a good optimizer 
might figure out to actually return a fat pointer to the slice for the 
Row operation.






^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2003-05-24 23:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-23  9:14 Slice from a matrix? Harald Schmidt
2003-05-23 10:52 ` Dale Stanbrough
2003-05-23 11:23 ` David C. Hoos
2003-05-23 14:15   ` P S Norby
2003-05-24 23:00     ` Robert I. Eachus
2003-05-23 18:13   ` Georg Bauhaus
2003-05-23 17:56 ` Stephen Leake
2003-05-23 20:03   ` Simon Wright
2003-05-23 21:06     ` Stephen Leake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox