質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

7464閲覧

Processing の配列の複製について。

Cohey

総合スコア9

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2015/10/12 07:32

Processingの複製について質問です。
clone()やarrayCopyを用いて、配列をコピーする際、一次元配列であれば、複製元の配列は複製後の配列の影響を受けないということを知っているのですが、二次元配列だと、どうも影響を受けるようです。以下のようなプログラムを実行した結果、以下の結果となりました。

----------------------------------コード----------------------------------
float[][] matrix1, matrix2;

void setup() {
matrix1 = Function1("data.csv");
matrix2 = Function2(matrix1.clone());

for (int i=0; i<matrix1.length; i++) {
println(matrix1[i]);
}
}

float[][] Function1(String s){
float[][] a={{1,2,3},{4,5,6}};
return a;
}

float[][] Function2(float[][] a){
a[0][0]=10;
return a;
}

----------------------------------結果----------------------------------
[0]10
[1]2
[0]3
[1]4

私の予想では、matrix1[0][0]=1のままであると思ったのですが、cloneを使っているにもかかわらず、10に書き換えられてしまします。ちなみに、一次元配列であれば、書き換えられることはありませんでした。
どのように回避したらよいでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Processing については全くの初心者なので、不正確な点があったらゴメンなさい。

下記資料を見ると、二次元配列に対してclone を実施すると 浅いコピー(shallow copy) になってしまうようですね。

Processing言語による情報メディア入門
⇒ PFDの資料です。10ページ目の最後を御覧ください。

こちらの Reference を見ると、配列(Array) って一次元配列しか定義されていません。
つまり、二次元配列は、「一次元配列」というオブジェクトの配列なので、clone すると浅いコピーになってしまうのではないでしょうか?

リファレンスをツラツラと眺めてみましたが、一発で深いコピー(deep copy)できるようなメソッドはありませんでした。
検索してみても、いろいろなサイトで同様の質問が挙がっていましたが、これといった回答は見つけられませんでした。

配列であれば、単純に各要素をforループでコピーしてしまった方が速いのではないでしょうか?

投稿2015/10/12 10:28

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cohey

2015/10/12 12:18

各要素をforループでコピーすることで解決できました。深いコピーができるメソッドがあるのかと思いましたが。。。わざわざ調べていただきありがとうございます。
guest

0

ベストアンサー

次のコードと、実行結果は理解出来ますでしょうか?
コード

java

1float[][] matrix1, matrix2, matrix3; 2 3void setup() { 4 matrix1 = Function1("data.csv"); 5 matrix2 = matrix1.clone(); 6 matrix3 = copy_array2(matrix1); 7 8 matrix2[0][0] = 10; 9 10 show_array(matrix1); 11 show_array(matrix2); 12 show_array(matrix3); 13} 14 15float[][] Function1(String s) { 16 float[][] a = {{1, 2, 3},{4, 5}}; 17 return a; 18} 19float[][] copy_array2(float[][] src) { 20 float[][] a = src.clone(); 21 for (int i = 0; i < src.length; i++) { 22 a[i] = src[i].clone(); 23 } 24 return a; 25} 26void show_array(float[][] a) { 27 println(); 28 for (int i = 0; i < a.length; i++) { 29 println(a[i]); 30 } 31}

実行結果

[0] 10.0 [1] 2.0 [2] 3.0 [0] 4.0 [1] 5.0 [0] 10.0 [1] 2.0 [2] 3.0 [0] 4.0 [1] 5.0 [0] 1.0 [1] 2.0 [2] 3.0 [0] 4.0 [1] 5.0

1 次元配列、2 次元配列のメモリー上での構造については次を参考にしてください。
参考情報

質問文にある方法では、 a[0], a[1] が clone されますが、 a[0][0] , a[0][1] など a[0] の先が clone されていないのです。

投稿2015/10/12 09:14

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cohey

2015/10/12 12:16

for文で回避できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問