Matlab фильтрует две строки, чтобы сделать их равными - PullRequest
0 голосов
/ 22 марта 2020

Мне нужно сравнить два символьных массива и сделать их абсолютно одинаковыми. В то же время мне нужны координаты символов, которые я сохранил.

Например, у меня есть два массива символов

A=['a';'b';'b';'b';'c';'d'];
B=['a';'b';'b';'d'];

Я хочу, чтобы результат был

Anew=['a';'b';'b';'d'];
Bnew=['a';'b';'b';'d'];

и я хочу узнать позиции

APos=[1;2;3;6];
BPos=[1;2;3;4];

Чтобы

Anew=A(APos);
Bnew=B(BPos);

Я попробовал следующий код

[lmod1,lmod2]=size(A);
[lobs1,lobs2]=size(B);

PosB=zeros(lobs1,1);

for i=1:lobs1
    for j=1:lmod1
        if B(i,:)==A(j,:)
            PosB(i,:)=i; %collect the ones that are in there, the zeros should then be the ones that are not 
        end
    end
end

PosB2=PosB(PosB~=0);

PosA=zeros(lmod1,1);
for i=1:lmod1
    for j=1:lobs1
        if A(i,:)==B(j,:)% if this is true at the end of the loop, it means that the value of namesobs is in namesw
            PosA(i,:)=i; %collect the ones that are in there, the zeros should then be the ones that are not 
        end
    end
end

PosA2=PosA(PosA~=0);

Но это только проверка на наличие , не если значения повторяются разное количество раз. Как добавить дополнительный фильтр, чтобы строки повторялись одинаковое количество раз в обоих строковых массивах?

К вашему сведению, строки, с которыми я работаю, выглядят так:

>> ODates(1:10,:)

ans =

  10×12 char array

    '20100202_186'
    '20100202_186'
    '20100202_190'
    '20100202_190'
    '20100202_190'
    '20100202_190'
    '20100202_190'
    '20100202_191'
    '20100202_191'
    '20100202_191'

EDates (1:10,:)

ans =

  10×12 char array

    '20100202_186'
    '20100202_190'
    '20100202_190'
    '20100202_190'
    '20100202_190'

И тогда ответ будет:

NewDates (1 : 10,:)

ans =

  10×12 char array

    '20100202_186'
    '20100202_190'
    '20100202_190'
    '20100202_190'
    '20100202_190'

1 Ответ

0 голосов
/ 22 марта 2020

Вы были на правильном пути, решив это с помощью циклов, но я чувствую, что вы думаете, что это слишком сложно. Проверьте это решение

A=['a';'b';'b';'b';'c';'d'];
B=['a';'b';'b';'d'];

% allocate logical vectors
lgA = false(size(A));
lgB = false(size(B));

% initialize loop control counter
ia0 = 1;
% looping
for ib = 1:length(B)
    for ia = ia0:length(A)
        % check if A == B and stop the looping over A if it is true
        if A(ia) == B(ib)
            % store 
            lgA(ia) = true;
            lgB(ib) = true;
            % update loop control counter to start from the current
            % index the next time
            ia0 = ia+1;
            break
        end
    end
end
% validity check
assert( all(A(lgA) == B(lgB)) )
% output
APos = find(lgA);
BPos = find(lgB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...