2012-04-09 10 views
1

2つのベクトルを考えてみましょう:見つける平均は唯一

v= [1 2 3 4 5 6 7] 

a=['a' 'b' 'c' 'a' 'a' 'a' 'd'] 

私は内のエントリを対応する「A」であるVのすべてのエントリの平均を見つけたいです。

すなわちテスト=平均(1,3,4,5)

私はエントリをキャッチするスタートのためにこれを試してみました:

for i=1:7 
if abs(char(a(i))-char(c))==0; 
    test(i)=v(i); 
end 
end 

テスト

test =  1  0  0  4  5  6 

PROBL EMS:それは、エントリの0を割り当てている

  1. 見つからない
  2. それは最後の項を考慮していない

答えて

1

ismember機能を試してみてください:

>> help ismember 
ismember True for set member. 
    ismember(A,S) for the array A returns an array of the same size as A 
    containing 1 where the elements of A are in the set S and 0 otherwise. 
    A and S can be cell arrays of strings. 

ismemberフォームをあなたのtest論理アレイとしてのベクトル、お尻

>> ismember(a, 'a') 

ans = 

1  0  0  1  1  1  0 

あなたは、あなたのベクトルvから対応するエントリを抽出するために論理インデックスとしてこれを使用することができます。文字は「」あなたのベクトルで見つかった、と0それがない場合にされて1 igning:

>> mean(v(ismember(a, 'a'))) 

ans = 

    4 

>> v(ismember(a, 'a')) 

ans = 

    1  4  5  6 

最後に、あなたはこのベクトルの平均値を取ることができますだから、コードのあなたの最後の行がそうのようになります。

>> a == 'a' 

ans = 

    1  0  0  1  1  1  0 

EDIT 私はあなたのケースでは、あなたが実際に比較演算子を使用して、はるかに簡単な方法であなたの論理配列を形成することができることを実現しています。

>> mean(v(a == 'a')) 

ans = 

    4 

ismemberあなたがいた「」または「B」の位置を検索する場合、たとえば、複数の文字の存在をテストしたい場合に有用です。

+0

+1非常によく説明されています。 –

+0

vとaが行列の場合はどうしますか?試してみました:k = 1:TotalnoOfGrids j = 1の場合:noOfNodes M = mean(Allvalues {k}(j))== char(mostCommonLetters {k})))); Ms {k} = MyPerfectAverage;何か問題でも。@Bill Chaeatham – pac

+0

vとaが等しいサイズの行列の場合、上記のコードはすべて動作しますが、最初にベクトル化する必要があります。つまり 'mean(v(a(:) == 'a'))' –