Re: arbitrary dimension array for math
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 Ram wrote:
"Dimitri Ognibene" <dimitri.ognibene@gmail.com> writes:
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