arbitrary dimension array for math

  • Thread starter Dimitri Ognibene
  • Start date
D

Dimitri Ognibene

Hi,
I need some help writing a class implementing operations on arbitrary
dimension array, and be able to apply operation like block extraction,
vector or matrix product , filter (product for a matrix of smaller
dimension, kind of mask)
I'm writing the code but it is rather complicated, and so it's cool,
but it could be useful to have some example.
Please if you know any solution, library or example, let me know
Thanks Dimitri
 
S

Stefan Ram

Dimitri Ognibene said:
I'm writing the code but it is rather complicated, and so it's cool,
but it could be useful to have some example.

I wrote the following code as an example to show how to
dynamically create and fill an arrays whose arbitrary
extensions and arbitrary dimension is only known at run-time.

Here it is suppossed to have 3 dimensions with extensions 4,
5, and 6, respectively.

public class Main
{
public static int[] cdr( final int[] list )
{ return java.util.Arrays.copyOfRange( list, 1, list.length ); }

public static java.lang.Object build( final int ... extensions )
{ final java.lang.Object array = java.lang.reflect.Array.newInstance
( java.lang.Integer.TYPE, extensions );
for( int i = 0; i < extensions[ 0 ]; ++i )if( extensions.length > 1 )
java.lang.reflect.Array.set( array, i, build( cdr( extensions )));
else java.lang.reflect.Array.setInt(( int[] )array, i, i );
return array; }

public static void print( final java.lang.Object array )
{ for( int i = 0; i < java.lang.reflect.Array.getLength( array ); ++i )
if( array.getClass().getName().startsWith( "[[" ))
print( java.lang.reflect.Array.get( array, i )); else
java.lang.System.out.print( java.lang.reflect.Array.getInt( array, i )); }

public static void main( final java.lang.String[] args )
{ print( build( 4, 5, 6 )); }}

012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345
 
D

Dimitri Ognibene

for arbitrary dimension i mean a class wich at run time can be seen, as
a[]
or a[][]
or a[][][]
or a[][][][]

Becouse I have some algs that are invariant, theoretically on this kind
of structure but don't wont to write a version of them for every
option..
thanks
 
D

Dimitri Ognibene

thanks stefan,
I'm know very few of reflection, I used it years ago only for oo-db
mapping...
Do you know if there are any perfomance issues?
here is my simple constructor, still writing subblock extraction:
public MultiDimensionalMatrix(int[] _dimension) {
dimensions=_dimension;
strides=new int[dimensions.length];
strides[dimensions.length-1]=1;
for (int i = 0; i < dimensions.length-1; i++)
strides[dimensions.length-2-i]=

strides[dimensions.length-1-i]*dimensions[dimensions.length-1-i];
flatDimension=strides[0]*dimensions[0];

flatData=new double[flatDimension];
}

public final int[] getCoordinates(final int point_index,int result[]) {
if (result==null)result=new int[dimensions.length];

for (int j = 0; j < strides.length; j++) {
result [j]=((point_index/strides[j])%dimensions[j]);
}

return result;
}

.....
....
thanks very *1000 much
Dimitri
Using strides i could be able to implement the various operation, i
think, but long time has gone from my math programming courses..
for some kind of operation the structure can be easily reconstructed by
the alg... i think..
any tip?
Do you think reflection is the right way to go?
thanks

Stefan said:
Dimitri Ognibene said:
I'm writing the code but it is rather complicated, and so it's cool,
but it could be useful to have some example.

I wrote the following code as an example to show how to
dynamically create and fill an arrays whose arbitrary
extensions and arbitrary dimension is only known at run-time.

Here it is suppossed to have 3 dimensions with extensions 4,
5, and 6, respectively.

public class Main
{
public static int[] cdr( final int[] list )
{ return java.util.Arrays.copyOfRange( list, 1, list.length ); }

public static java.lang.Object build( final int ... extensions )
{ final java.lang.Object array = java.lang.reflect.Array.newInstance
( java.lang.Integer.TYPE, extensions );
for( int i = 0; i < extensions[ 0 ]; ++i )if( extensions.length > 1 )
java.lang.reflect.Array.set( array, i, build( cdr( extensions )));
else java.lang.reflect.Array.setInt(( int[] )array, i, i );
return array; }

public static void print( final java.lang.Object array )
{ for( int i = 0; i < java.lang.reflect.Array.getLength( array ); ++i )
if( array.getClass().getName().startsWith( "[[" ))
print( java.lang.reflect.Array.get( array, i )); else
java.lang.System.out.print( java.lang.reflect.Array.getInt( array, i )); }

public static void main( final java.lang.String[] args )
{ print( build( 4, 5, 6 )); }}

012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345012345
 
D

Dimitri Ognibene

yes.. it is very "interesting", damn'it, :D
Chris said:
Two dimensional only (as is the companion package, Jampack).

I don't know of a arbitrary-dimensional package myself. There would be some
very "interesting" design problems...

-- chris
 
S

Stefan Ram

Dimitri Ognibene said:
Do you know if there are any perfomance issues?

Reflection, in general, will be slower than non-reflective
access.

You also could implement a 3-dimensional matrix as a
1-dimensional array, and calculate the array offset for the
matrix component [i,j,k] as i*(n*m)+j*m+k.

This also can be written for a dynamic dimension.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top