1. ホーム
  2. arrays

[解決済み] MATLABで動的配列を作成する方法

2022-02-09 16:39:10

質問

この配列の説明

  • 10次元で、10のクラスターを表す。
  • 各次元の長さは固定ではないので、最初は0であるべきである。
  • クラスタリング後、1つの座標(x,y)が対応するクラスタに割り振られます。

(1,1)がクラスタ10に属し、(2,2)がクラスタ9に属し、座標の列が与えられた場合

(1,1) (1,1) (1,1) (1,1) (1,1) (2,2)

では A(1) から A(8) は要素がないのに対して A(9) は、値を持つ1つの要素を持っています。 (2,2)A(10) は、値を持つ5つの要素 (1,1) .


私はセル配列を使用しようとしましたが、私は1つを得る"一種の"、以下は私のコードです。

A = cell(10,0) 
%create empty cell array
A(10,end+1) = {[1,1]} 
%assign (1,1) to cluster 10

そこで今度は A があります。

次に、(2,2) があるとすると、それは次のように割り当てられます。 A(9)

A(9,end) = {[2,2]}

見た目は問題ないのですが、次に(1,1)を A(10) を再び使用します。

A(10,end) = {[1,1]}

そうすると、長さはそのままで A(1) から A(8) は空ではありません!

質問は、動的な配列を作成するのに役立つ他の方法はないのでしょうか?

どのように解決するのですか?

MATLABでは、複数の座標を1つの配列に格納することが多く、次のようになります。 p(3,:) が3点目です。[この理由の一つは、各配列にはオーバーヘッドがあり、セル配列などの中に個々の配列として多くの点を格納することはメモリの浪費につながるため、この方法がデータを格納する上ではるかに効率的であるためです]。

その方法で、各クラスタ内の座標を保存するのがいいと思います。例えば

A = cell(10,1); % 10 clusters, we won't change the size of A
A{10}(end+1,:) = [1,1]; 
A{9}(end+1,:) = [2,2];
A{10}(end+1,:) = [1,1];

さて、中身はどうなっているのでしょう。 A :

>> A{1}
ans =
     []

>> A{9}
ans =
     2     2

>> A{10}
ans =
     1     1
     1     1

なお A{10} はセルの内容(この場合、数値配列)であるのに対し A(10) は、セルが1つだけのセル配列です。

A{10}(1,:) はクラスタ10の最初の座標です。 size(A{10},1) はクラスタ10に含まれる座標の数です。

A{10}(end+1,:) = [1,1] は、要素を追加する方法の一つです。 end+1 は存在しない場所なので、そこに新しいデータが代入されると配列が拡張されます。別の方法として A{10} = [A{10} ; 1,1] . この2つの方法が同等かどうかは分かりませんが。ベクターの場合、あるいは列を追加する場合には end+1 の方がはるかに効率的なので、私はどんな場合でも必ずこの方法を推奨しています。