You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by "Cuong P. Nguyen" <cn...@iit.edu> on 2010/11/04 18:27:04 UTC
[math] complex[][] clone problem
Hi,
I might have a trivial problem and hope some of you can explain. Here is the
source code I used, where I wanted to clone c Complex[][] object to
Complex[][] d. The problem is when c matrix is updated, d is also updated
which I did not expect. I expect d to stay the same when c is updated.
Thanks in advance,
Cuong
Code:
System.out.println("Test 1.3");
Complex[][] c = new Complex[][]{{new Complex(1,2), new
Complex(3,4)},
{new Complex(5,6), new Complex(7,8)}};
Complex[][] d = c.clone();
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
c["+i+"]["+j+"]="+format.format(c[i][j]));
}
}
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
d["+i+"]["+j+"]="+format.format(d[i][j]));
}
}
System.out.println("Test 1.4");
c[0][0]=c[0][0].multiply(100);
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
c["+i+"]["+j+"]="+format.format(c[i][j]));
}
}
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
d["+i+"]["+j+"]="+format.format(d[i][j]));
}
}
And the results are:
Test 1.3
c[0][0]=1.0000000 + 2.0000000i
c[0][1]=3.0000000 + 4.0000000i
c[1][0]=5.0000000 + 6.0000000i
c[1][1]=7.0000000 + 8.0000000i
d[0][0]=1.0000000 + 2.0000000i
d[0][1]=3.0000000 + 4.0000000i
d[1][0]=5.0000000 + 6.0000000i
d[1][1]=7.0000000 + 8.0000000i
Test 1.4
c[0][0]=100.0000000 + 200.0000000i
c[0][1]=3.0000000 + 4.0000000i
c[1][0]=5.0000000 + 6.0000000i
c[1][1]=7.0000000 + 8.0000000i
d[0][0]=100.0000000 + 200.0000000i
d[0][1]=3.0000000 + 4.0000000i
d[1][0]=5.0000000 + 6.0000000i
d[1][1]=7.0000000 + 8.0000000i
RE: [math] complex[][] clone problem
Posted by Dean <de...@gmail.com>.
iirc clone by default returns a shallow copy, so what you end up doing
is creating a refrence to the object in question. I know that is the
default behaviour with non-primatives. You should override clone to
perform a deep copy if thats what you need, or use a copy constructor.
~Dean
On Thu, 2010-11-04 at 17:54 +0000, Haswell, Joe wrote:
> I think the issue is with how Array.clone() operates on multi-dimensional arrays. Cloning a multi-dimensional array will create a new multi-dimensional array with the same dimensions and the same sub-arrays as elements, so Complex[][] d = ... etc. Complex[][] c = d.clone(); c[0] == d[0] should return true.
>
> Joe H. | HP Software
>
> -----Original Message-----
> From: Cuong P. Nguyen [mailto:cnguyen7@iit.edu]
> Sent: Thursday, November 04, 2010 11:27 AM
> To: user@commons.apache.org
> Subject: [math] complex[][] clone problem
>
> Hi,
>
>
>
> I might have a trivial problem and hope some of you can explain. Here is the
> source code I used, where I wanted to clone c Complex[][] object to
> Complex[][] d. The problem is when c matrix is updated, d is also updated
> which I did not expect. I expect d to stay the same when c is updated.
>
>
>
> Thanks in advance,
>
> Cuong
>
>
>
>
>
>
>
> Code:
>
> System.out.println("Test 1.3");
>
> Complex[][] c = new Complex[][]{{new Complex(1,2), new
> Complex(3,4)},
>
> {new Complex(5,6), new Complex(7,8)}};
>
> Complex[][] d = c.clone();
>
> for (int i=0;i<2;i++) {
>
> for (int j=0;j<2;j++) {
>
> System.out.println("
> c["+i+"]["+j+"]="+format.format(c[i][j]));
>
> }
>
>
>
> }
>
> for (int i=0;i<2;i++) {
>
> for (int j=0;j<2;j++) {
>
> System.out.println("
> d["+i+"]["+j+"]="+format.format(d[i][j]));
>
> }
>
>
>
> }
>
> System.out.println("Test 1.4");
>
> c[0][0]=c[0][0].multiply(100);
>
> for (int i=0;i<2;i++) {
>
> for (int j=0;j<2;j++) {
>
> System.out.println("
> c["+i+"]["+j+"]="+format.format(c[i][j]));
>
> }
>
>
>
> }
>
> for (int i=0;i<2;i++) {
>
> for (int j=0;j<2;j++) {
>
> System.out.println("
> d["+i+"]["+j+"]="+format.format(d[i][j]));
>
> }
>
>
>
> }
>
>
>
> And the results are:
>
> Test 1.3
>
> c[0][0]=1.0000000 + 2.0000000i
>
> c[0][1]=3.0000000 + 4.0000000i
>
> c[1][0]=5.0000000 + 6.0000000i
>
> c[1][1]=7.0000000 + 8.0000000i
>
> d[0][0]=1.0000000 + 2.0000000i
>
> d[0][1]=3.0000000 + 4.0000000i
>
> d[1][0]=5.0000000 + 6.0000000i
>
> d[1][1]=7.0000000 + 8.0000000i
>
> Test 1.4
>
> c[0][0]=100.0000000 + 200.0000000i
>
> c[0][1]=3.0000000 + 4.0000000i
>
> c[1][0]=5.0000000 + 6.0000000i
>
> c[1][1]=7.0000000 + 8.0000000i
>
> d[0][0]=100.0000000 + 200.0000000i
>
> d[0][1]=3.0000000 + 4.0000000i
>
> d[1][0]=5.0000000 + 6.0000000i
>
> d[1][1]=7.0000000 + 8.0000000i
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
> For additional commands, e-mail: user-help@commons.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org
RE: [math] complex[][] clone problem
Posted by "Haswell, Joe" <jo...@hp.com>.
I think the issue is with how Array.clone() operates on multi-dimensional arrays. Cloning a multi-dimensional array will create a new multi-dimensional array with the same dimensions and the same sub-arrays as elements, so Complex[][] d = ... etc. Complex[][] c = d.clone(); c[0] == d[0] should return true.
Joe H. | HP Software
-----Original Message-----
From: Cuong P. Nguyen [mailto:cnguyen7@iit.edu]
Sent: Thursday, November 04, 2010 11:27 AM
To: user@commons.apache.org
Subject: [math] complex[][] clone problem
Hi,
I might have a trivial problem and hope some of you can explain. Here is the
source code I used, where I wanted to clone c Complex[][] object to
Complex[][] d. The problem is when c matrix is updated, d is also updated
which I did not expect. I expect d to stay the same when c is updated.
Thanks in advance,
Cuong
Code:
System.out.println("Test 1.3");
Complex[][] c = new Complex[][]{{new Complex(1,2), new
Complex(3,4)},
{new Complex(5,6), new Complex(7,8)}};
Complex[][] d = c.clone();
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
c["+i+"]["+j+"]="+format.format(c[i][j]));
}
}
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
d["+i+"]["+j+"]="+format.format(d[i][j]));
}
}
System.out.println("Test 1.4");
c[0][0]=c[0][0].multiply(100);
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
c["+i+"]["+j+"]="+format.format(c[i][j]));
}
}
for (int i=0;i<2;i++) {
for (int j=0;j<2;j++) {
System.out.println("
d["+i+"]["+j+"]="+format.format(d[i][j]));
}
}
And the results are:
Test 1.3
c[0][0]=1.0000000 + 2.0000000i
c[0][1]=3.0000000 + 4.0000000i
c[1][0]=5.0000000 + 6.0000000i
c[1][1]=7.0000000 + 8.0000000i
d[0][0]=1.0000000 + 2.0000000i
d[0][1]=3.0000000 + 4.0000000i
d[1][0]=5.0000000 + 6.0000000i
d[1][1]=7.0000000 + 8.0000000i
Test 1.4
c[0][0]=100.0000000 + 200.0000000i
c[0][1]=3.0000000 + 4.0000000i
c[1][0]=5.0000000 + 6.0000000i
c[1][1]=7.0000000 + 8.0000000i
d[0][0]=100.0000000 + 200.0000000i
d[0][1]=3.0000000 + 4.0000000i
d[1][0]=5.0000000 + 6.0000000i
d[1][1]=7.0000000 + 8.0000000i
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org