2016-04-29 9 views
1

Matlabでは、ベクトルAのサイズは30x1で、ベクトルBのサイズは3x1です。ベクトル要素を再割り当てするループmatlab

A = [1.23 2.2 3.3 4.8 5.1 6.7 7.1 8.2 9.9 10.25 11.00 12.1 13.2 14.3 15.4 16.5 17.5 18.1 19.8 20.188 21.2 22.4 23.6 24.1 25.2 26.7 27.8 28.2 29.1 30.3]'; 

    B = [1.23 10.25 20.188]; 
私は Aから Aと同じサイズのベクトル Cを作成したい

BB

C = [2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2]'; 

番号はAの要素とまったく同じです倍、いくつかあるような離れた要素、例えばB(2)=A(10)

は今、私はそれがCに2を書き込みAのように、それがその後、書き込みますAと同じであるBの次の要素が見つかるまでたびにループがBで同じ番号を見ているようなループを記述する必要があります1を検索し、次の同じ要素が見つかるまで続けます。

B(1) = 1.23 and A(1) = 1.23 so C(1:i,1)=2; %where i is the index of the 
next similar element. 

このループを正確に書き込む方法についてお手伝いできますか?私はループ全体を、同じ要素の位置がどこにあるのか、または異なるサイズのベクトルを持つことができるために仮定しないようにする必要があります(これは後でスクリプトで実装する必要があります)。

ありがとうございます!

+0

上のループは必要ないが、両方のベクトルの値が常に昇順するつもりですか? – excaza

+0

'A'の最初の値はいつも' B'の最初の値になりますか? – excaza

+0

'B'の値は常に' A'に入っていますか? – excaza

答えて

4

インデックスを検索することから始めることができます。以下を試してみてください:

locs = find(ismember(A, B)) % This will give you the required indices 
N = numel(locs); 

% Pre-allocate the C vector 
C = zeros(size(A)); 
L = numel(C); 

if ~mod(N, 2) 
    C(locs(N):L) = 1; 
else 
    C(locs(N):L) = 2; 
end 

% Now start the loop 
for i = 1:N-1 
    if ~mod(i,2) 
     C(locs(i):locs(i+1)-1) = 1; 
    else 
     C(locs(i):locs(i+1)-1) = 2; 
    end 
end 

希望します。エラー処理を追加して、コードを短縮する方法を見つけることができます。

+0

ありがとう!できます!!しばらくすると、AとBのデータ要素で、時には100%同じではないことがわかりました。 Aの要素は19.14、B 19.21の要素になりますが、与えられた "許容値"内でメンバーを見つけて、このコードを使用する方法が見つかりました。 'tol = 0.5; (1、2)); 1) ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; j = 1; i = 1の場合:size(A)ind(i)== 1; IND3(j)= i; j = j + 1;終わり; i = i + 1;末尾 IND3 = IND3 '; locs = IND3; ' –

1

どのようにベクトル化されたワンライナーについて:

mod(cumsum(ismember(A,B)),2)+1 

この1

+0

私はこの人をループで書く必要があると思っていました。 +1 – Amal

関連する問題