В Matlab у меня есть вектор A размером 30x1 и другой вектор B размером 3x1.

  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];

Я хочу создать вектор C того же размера, что и A из A и B, чтобы

  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]';

Числа в B - это времена, которые точно такие же, как элементы в A, с некоторыми элементами отдельно, например, B(2)=A(10).

Теперь мне нужно написать цикл так, чтобы каждый раз, когда цикл видит в B то же число, что и в A, он записывает 2 в C, пока не найдет следующий элемент {{X3} } который совпадает с A, где он затем будет писать 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. 

Может ли кто-нибудь помочь мне, как именно написать этот цикл? Мне нужно сделать цикл общим, чтобы не предполагать, где находятся позиции одних и тех же элементов или что могло бы быть, потому что у меня могут быть векторы разного размера (когда мне нужно реализовать это позже в скрипте).

Благодарность!!

1
Maheen Siddiqui 29 Апр 2016 в 17:40

2 ответа

Лучший ответ

Вы можете начать с поиска индексов. Попробуйте следующее:

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

Надеюсь это поможет. Вы можете добавить к нему обработку ошибок и найти способы сократить код.

4
Amal 29 Апр 2016 в 20:40

Как насчет векторизованного однострочника:

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

Нет необходимости в петлях на этом

1
Dan 29 Апр 2016 в 17:48