1

test と呼ばれる構造体の次の配列があります。各フィールドは、行列を含む [1x3] 構造体配列です。各行列を要素ごとに二乗する新しいフィールド、levelsq を作成したいと思います。ループでこれを行うことができます:

[test(1:3).level] = deal([1,1],[2,2],[3,3])

for i = 1:3
   test(i).levelsq = test(i).level.^2
end

test.level
ans =
     1     1
ans =
     2     2
ans =
     3     3

test.levelsq
ans =
     1     1
ans =
     4     4
ans =
     9     9

要素を分離して連結することである程度の方法はありましたが、まだ新しいフィールドを追加できていません。

temp = num2cell([test.level].^2) 
test.levelsq = temp{:}
??? Illegal right hand side in assignment. Too many elements.

次に、一時変数の形状を変更しようとしましたが、まだ正しい形式ではありません

temp2= reshape(temp,2,3)'
temp2 = 
[1]    [1]
[4]    [4]
[9]    [9]

ループしたり、コンテンツを分離したりすることなく、これを行う簡単な方法はありますか? ありがとう。

4

2 に答える 2

1
test = arrayfun(@(x) setfield(x, 'levelsq', x.level .^ 2), test);

ところで、列ベクトルを設定すると、配列の値に簡単にアクセスできます。

>> [test.level]

ans =

     1     2     3
     1     2     3

>> [test.levelsq]

ans =

     1     4     9
     1     4     9
于 2012-06-27T21:41:46.330 に答える
0

アプリケーションに必要なデータ型を検討する必要がある場合があります。現在、数値配列、セル配列、および構造体 (二重にネストされた構造体!) を使用しています。

「Matlab」アプローチは、数値配列、別名行列を使用してこれらすべてを行うことです。それらは高度に最適化されており、数学演算に非常に役立ちます。

あなたがすることができます:

level = [ 1 1; 2 2; 3 3;];
levelsq = level.^2;

単一のデータ構造で と の両方を保持するlevel場合levelsqは、2 つを連結して 3 次元行列にすることができます。

test = cat(3, level, levelsq);

また、 を呼び出すことで level にアクセスでき、 を呼び出すことtest(:,:,1)で levelq にアクセスできますtest(:,:,2)

一方、使用しているデータ構造を維持する必要がある場合は、@Serg に勝るものはありません。

于 2012-06-27T21:48:49.297 に答える