Поиск особых условий в массиве ячеек с помощью struct format MATLAB

#matlab #struct #cell

#matlab #структура #ячейка

Вопрос:

Это мой вопрос.

У меня есть следующие переменные:

 A={'BB.AI';'JL.AI';'BB.AA';'HH.JJ.BB';'JL.H1.P6';'H1.P2'};
B={'BB';'BB.JJ';'JL.H1.P6'};
  

Теперь мне нужна функция, которая использует в качестве входной информации B в A и получает следующую информацию:

 [Result]=Somefunction(A,B)
  

И переменный результат — это структура:

 Result(1).label={'BB'}; % Is the first value of cell array B.
Result(1).f1={'BB.AI';'BB.AA';'HH.JJ.BB'}; % These are all the values of cell array A which have 'BB';
Result(1).f2=[1;3;4]; % These are the positions in A with the value 'BB';


Result(2).label={'BB.JJ'}; % Is the second value of cell array B.
Result(2).f1={'HH.JJ.BB'}; % This is the values of cell array A which have 'BB.JJ';
Result(2).f2=[4]; % These is the position in A with the value 'BB.JJ';


Result(3).label={'JL.H1.P6'}; % Is the third value of cell array B.
Result(3).f1={'JL.H1.P6'}; % This is the values of cell array A which have 'JL.H1.P6';
Result(3).f2=[5]; % This is the position in A with the value 'JL.H1.P6';


Result(4).NoneUsed={'JL.AI','H1.P2'}; % These are the values which weren't used.
Result(4).f2=[2;6]; % These are the positions in A with the values non used;
  

Я пытался это сделать, но мне пришлось использовать много циклов, я надеюсь, что вы сможете упростить это, возможно, с помощью cellfuns, спасибо!

Ответ №1:

 [Result]=SomeFunction(A,B)

H2=[];
    for i=1:size(B,1)
        [a] = strread(B{i}, '%s', 'delimiter','.');
        H=cell(size(a,1),1);
        for k=1:size(a,1)
            H{k,1} = cell2mat(cellfun(@isempty,(strfind(A,a{k})),'UniformOutput', false))==0;
        end
        H=cell2mat(H');
        if size(H,2)>1
            H=sum(H')';
        end
        H=find(H==size(a,1));
        if  ~isempty(H)
            Result(i).label=B{i};
            Result(i).f1=A(H);
            Result(i).f2=H;
        end
        H2=[H2,H'];
        clearvars H
    end
    A2=A;A3=1:size(A,1);
    A3(unique(H2))=[];
    A2(unique(H2))=[];

    Result(i 1).label=A2;
    Result(i 1).f1=A3;