Удалить определенные строки путем наложения условия - PullRequest
0 голосов
/ 05 июня 2019

У меня есть структура, состоящая из столбца «Имена» и столбца «Данные».

enter image description here Мне нужно удалить ряд строк, наложив условие относительно конкретного имени,Я использовал этот код в другом упражнении, и он, кажется, был в порядке, но я думаю, что это не правильно:

    sn = {'Adattamento ad una distrib._HID',...
          'Adattamento ad una distrib._HI1',...
          'TUTTI','Modelling','Sheet37','Sheet52'}; % fogli da escludere

   SheetNames = {S.Name}; %% 

    for jj = 1:length(sn)
      SheetNames = {S.Name};
      S = S(~strncmp(SheetNames, sn(jj),jj));
      %jj = numel(sn)-1; % aggiorna l'indice
    end  

---------------------------- UPDATE ------------------------------------ Я понял проблему.

Моя структура S.Name сделана так:

SheetNames = {S.Name};



  This is {S.Name} :

    {'Ar1';'Adattamento ad una distrib._HID';'Adattamento ad una distrib._HI1';...;'Ar2';'Ar35';...;
'Cos1';'Cos2';'Cos31';...;'Tex1';'Tex2';....;
'Sheet37_HID';'Tex8';.....;'Tex30';'Tu1';'Tu2';'Tu3';...;'Tu32';
'TUTTI';'Modelling';'Sheet52'}

, если

 sn = {'Adattamento ad una distrib._HID',...
          'Adattamento ad una distrib._HI1',...
          'TUTTI','Modelling','Sheet37','Sheet52'};

конечная структура S больше не будет содержатьимена, которые начинаются A , T , M , S

S = 1x128 после цикластановится S = 1x91

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Самое простое решение, которое я мог придумать, использует string и ismember:

function S2 = q56456298()
%% Generate a dataset:
ROWS = 128;
isUnwanted = randn(ROWS,1) > 0 ;
S = repmat(struct('Name',[], 'Data', []), 1, ROWS);
for ind1 = 1:ROWS
  if isUnwanted(ind1)
    S(ind1).Name = sprintf('Unwanted%u', ind1);
  else
    S(ind1).Name = sprintf('Useful%u', ind1);
  end
  S(ind1).Data = array2table(rand(randi(200),4));
end

%% Remove all "Unwanted fields"
names = string({S.Name}).'; % Here we collect all names, and make it a string array.

toRemove = "Unwanted" + (1:ROWS).'; % This simulates your "sn" array.
[~, idxToDelete] = ismember(toRemove, names);
S2 = S(~idxToDelete); % The result only contains "Useful" rows.
0 голосов
/ 05 июня 2019

Пусть данные будут определены как

S(1).Name = 'Ar1'; S(1).Data = [1 2 3];
S(2).Name = 'Adattamento ad una distrib._HID'; S(2).Data = 'abcd';
S(3).Name = 'Adattamento ad una distrib._HI1'; S(3).Data = [true; false];
S(4).Name = 'Ar4'; S(4).Data = {'4' '5'};
sn = {'Adattamento ad una distrib._HID',...
      'Adattamento ad una distrib._HI1',...
      'TUTTI','Modelling','Sheet37','Sheet52'};

Затем вы можете использовать ismember и логическое индексирование следующим образом:

result = S(~ismember({S.Name}, sn));
...