В 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.
Может ли кто-нибудь помочь мне, как именно написать этот цикл? Мне нужно сделать цикл общим, чтобы не предполагать, где находятся позиции одних и тех же элементов или что могло бы быть, потому что у меня могут быть векторы разного размера (когда мне нужно реализовать это позже в скрипте).
Благодарность!!
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
Надеюсь это поможет. Вы можете добавить к нему обработку ошибок и найти способы сократить код.
Как насчет векторизованного однострочника:
mod(cumsum(ismember(A,B)),2)+1
Нет необходимости в петлях на этом
Похожие вопросы
Новые вопросы
matlab
MATLAB - это высокоуровневая языковая и интерактивная среда программирования для численных расчетов и визуализации, разработанная MathWorks. Не используйте оба тега [matlab] и [octave], если явно не задан вопрос о сходстве или различии между ними. При использовании этого тега, пожалуйста, укажите версию MATLAB, с которой вы работаете (например, R2017a).