2017-03-27 10 views
1

私は構造(SA1)を持っている:FirstImpression、FashionSense、互換性(7 * 1)サイズ私はFirstImpression &ファッションセンスの最大値のインデックスを見つけ、1での互換性の値をインクリメントしたい構造内のフィールドの値を更新する|フィールドを使ってMATLAB

同じインデックスに

私は最大値のインデックスを見つけましたが、これらのインデックスの互換性値を増やすことは困難です。

方法を提案できますか?コードは次のとおりです。

firstImpression = zeros(1,size(sa1(),2)); 
fashionSense = zeros(1,size(sa1(),2)); 

for i=1:(size(sa1(),2)) 
firstImpression(i) = sa1(i).FirstImpression; 
fashionSense(i) = sa1(i).FashionSense; 
end 

maxFirstImpressionScore = max(firstImpression); 
maxFashionSenseScore = max(fashionSense); 
maxFirstImpressionScoreIndexes = find(firstImpression == maxFirstImpressionScore); 
maxFashionSenseScoreIndexes = find(fashionSense == maxFashionSenseScore); 

for k = 1:size(maxFashionSenseScoreIndexes,2) 
    sa1(maxFashionSenseScoreIndexes(k)).Compatibility = sa1(maxFashionSenseScoreIndexes(k)).Compatibility +1; 
end 

ご意見はありますか?

答えて

1

structの配列のドット表記を使用すると、comma separated listが生成され、配列を形成できます。そのたびにstructをループするのではなく、これらの配列を操作することができます。あなたの問題のために、あなたは次のようなものを使うことができます:

% Create an array of firstImpression values and find the maximum value 
mx1 = max([sa1.firstImpression]); 

% Create an array of fashionSense values and find the maximum value 
mx2 = max([sa1.fashionSense]); 

% Create a mask the size of sa1 that is TRUE where it was equal to the max of each 
mask1 = [sa1.firstImpression] == mx1; 
mask2 = [sa1.fashionSense] == mx2; 

% Increase the Compatibility of struct that was either a max of firstImpression or 
% fashionSense 
compat = num2cell([sa1(mask1 | mask2).Compatibility] + 1); 

% Replace those values with the new Compatibilty values 
[sa1(mask1 | mask2).Compatibility] = compat{:}; 
+0

ありがとう。あなたはこの小さなコードで私に多くのことを教えてくれました。ありがとう!! –

+0

あなたが書いたコードがIFループにあり、成功したifループの後に、互換値を元の値にリセットしたいとします。それではどうしますか? –

+0

@amansaraf最後の2行を繰り返して(少し修正して)、異なる値を再割り当てすることができます。 – Suever

関連する問題