Sorry for the confusion. I have another place in the application where
I am copying an array of objects. That is what I used for testing.

Rud


On Aug 26, 6:05 am, Peli <[email protected]> wrote:
> You confuse me:
> I thought a and b are float vectors - that is, vectors containing
> actual numbers, not pointers (for example to a Float class). As such,
> you can not .clone() them.
>
> Did you use Float (with capital "F") instead of float (with lower case
> "f")?
> Floats are classes surrounding float.
>
> If you want to work time-critical, you should use the simple float:
> float[] a = new float[3];
> float[] b = new float[3];
> a[0] = 1.2f;
> a[1] = 2.3f;
> ...
>
> and NOT
> Float[] a = new Float[3];
> a[0] = new Float(1.2f);
> a[1] = new Float(2.3f);
> ...
>
> Peli
>
> On Aug 26, 2:28 am, Rud <[email protected]> wrote:
>
>
>
> > System.arraycopy does not do a deep copy. I just tried it. But it is
> > very fast. <grin>
>
> > I setup the timing test. I did 5000 passes over the copy loops;
>
> >   522 ms    for (i=0; i<3; i++) a[i] = b[i].clone();
> >   453 ms    for(i=3; i-->0;) a[i] = b[i].clone();
> >   447 ms    int pos = 0; for(type x; b) a[pos++] = x.clone();
>
> > I had written a type.clone() to make the deep copy for each array
> > element. I was surprised that the for_each version did so well. I
> > won't put much faith in the timing differences between it and the
> > subtraction version.
>
> > Rudhttp://mysticlakesoftware.blogspot.com/
>
> > On Aug 25, 8:00 am, Peli <[email protected]> wrote:
>
> > > To deep copy an array, you can use 
> > > System.arraycopy(..)http://developer.android.com/reference/java/lang/System.html#arraycop...
>
> > > System.arraycopy(b, 0, a, 0, 3);
>
> > > but for a float array of length 3, you can simply write
> > > a[0]=b[0];
> > > a[1]=b[1];
> > > a[2]=b[2];
>
> > > or
> > > for (i=0; i<3; i++) a[i] = b[i];
>
> > > I've never tried to profile which of the 3 ways is actually the
> > > fastest on a real Android device. If someone has the time, please try
> > > all 3 in a tight loop and report back :-)
>
> > > (there is also
> > > for(i=3; i-->0;) a[i] = b[i];
> > > which may be even faster?)
>
> > > Note: all assume that you have initialized a already beforehand,
> > > a = new float[3];
>
> > > Peli
>
> > > On Aug 25, 8:24 am, Rud <[email protected]> wrote:
>
> > > > Hi,
>
> > > > The code is originally from my Blog. The reason for the clone is
> > > > explained there.
>
> > > > I admit to not having worked with Java enough to have the deep
> > > > understanding of how containers deal with objects. In my application I
> > > > ran into a problem trying to make a copy of an array and had to write
> > > > my own copy.
>
> > > > I had a set of data that gets consumed while the app runs. I wanted to
> > > > reset that data at times. I put the data in an array and then cloned
> > > > it to the working array. I was surprised when the original data got
> > > > changed when the cloned data was changed. I also realized that the
> > > > sensor code wasn't doing what I thought it was but haven't taken the
> > > > time to adjust it.
>
> > > > How in Java do you actually make a deep copy of an array?
>
> > > > Rudhttp://mysticlakesoftware.blogspot.com/
>
> > > > On Aug 21, 7:07 am, Peli <[email protected]> wrote:
>
> > > > > > .... = event.values.clone();
>
> > > > > Note that this creates new objects constantly that have to be garbage
> > > > > collected later. Depending on the kind of application, it may be
> > > > > better to just copy the values into a persisting array.
>
> > > > > Peliwww.openintents.org
>
> > > > > On Aug 21, 4:06 am, mscwd01 <[email protected]> wrote:
>
> > > > > > Heres my code, which works:
>
> > > > > > public void onSensorChanged(SensorEvent event) {
>
> > > > > >         Sensor sensor = event.sensor;
> > > > > >         int type = sensor.getType();
> > > > > >         switch (type) {
> > > > > >                 case Sensor.TYPE_MAGNETIC_FIELD:
> > > > > >                         mags = event.values.clone();
> > > > > >                         isReady = true;
> > > > > >                     break;
> > > > > >                 case Sensor.TYPE_ACCELEROMETER:
> > > > > >                     accels = event.values.clone();
> > > > > >                     break;
> > > > > >                 case Sensor.TYPE_ORIENTATION:
> > > > > >                     orients = event.values.clone();
> > > > > >                     break;
> > > > > >             }
>
> > > > > >             if (mags != null && accels != null && isReady) {
> > > > > >                 isReady = false;
>
> > > > > >                     SensorManager.getRotationMatrix(R, I, accels, 
> > > > > > mags);
> > > > > >                     SensorManager.remapCoordinateSystem(R,
> > > > > > SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, outR);
> > > > > >                     SensorManager.getOrientation(outR, values);
>
> > > > > >                                 azimuth = 
> > > > > > getAzimuth(-convert.radToDeg(values[0]));
> > > > > >                                 pitch= convert.radToDeg(values[1]);
> > > > > >                                 roll = -convert.radToDeg(values[2]);
>
> > > > > >             }
>
> > > > > >         }
>
> > > > > > On Aug 21, 2:39 am, Mike Collins <[email protected]> wrote:
>
> > > > > > > I have a sensor event handler that gets fired and I have no 
> > > > > > > problem
> > > > > > > getting and processing acceleration readings. However this code
> > > > > > > always fails.
>
> > > > > > >                 if (event.sensor.getType() == 
> > > > > > > Sensor.TYPE_ACCELEROMETER)
> > > > > > >                 {
> > > > > > >                         float[] geomagnetic = new float[3];
> > > > > > >                         geomagnetic[0] = geomagnetic[1] = 
> > > > > > > geomagnetic[2] = 0;
>
> > > > > > >                         float[] r = new float[9];
> > > > > > >                         float[] I = new float[9];
> > > > > > >                         boolean b = 
> > > > > > > SensorManager.getRotationMatrix(r, I, event.values.clone
> > > > > > > (), event.values.clone());
> > > > > > >                         if ( ! b)
> > > > > > >                         {
> > > > > > >                                 Log.e(LOG_TAG, "getRotationMatrix 
> > > > > > > failed");
> > > > > > >                                 return;
> > > > > > >                         }
> > > > > > > ...
>
> > > > > > > tia,
> > > > > > >   mike- Hide quoted text -
>
> > > > > - Show quoted text -- Hide quoted text -
>
> > > - Show quoted text -- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to