Похоже, что каждый фрагмент представляет собой уникальную комбинацию значений переменных вашего заголовка.Имея это в виду, мы можем использовать findgroups
и unique
для полного устранения петель.Тогда ситуация с «динамическим вложением» не является проблемой ...
Эта функция работает так, как вы ее описываете:
function plotter_fun(Table, headerNames)
% Create a matrix of group indices for each specified header
grps = zeros(size(Table,1), numel(headerNames));
for i = 1:numel(headerNames)
grps(:,i) = findgroups(Table.(headerNames{i}));
end
% Get the unique rows for the grouping variables
[~, ~, idx] = unique(grps, 'rows');
% Loop over each unique row index and slice out the specified rows.
for i = 1:max(idx)
Slice = Table( idx == i, : );
plot( Slice.x, Slice.y );
end
end
Test (работает, когда строка plot
удаляется, так как я не указал x
или y
столбцы):
tbl = cell2table( {'a', 1, 'dog';
'a', 2, 'cat';
'b', 3, 'cat';
'a', 2, 'cat'}, ...
'variablenames', {'char','num','pet'} )
plotter_fun( tbl, {'char', 'num', 'pet'} ) % output slices are rows [1], [2,4] and [3].
plotter_fun( tbl, {'char'} ) % output slices are rows [1,2,4] and [3].
Редактировать:
Вот гибкий способ автоматического создания "Фильтр "Метка от Slice
.Мы можем объединить =
между headerNames
и табличными значениями (преобразованными с использованием num2str
в случае наличия числовых значений), а затем использовать strjoin
, чтобы сгенерировать нашу метку, разделенную ,
для каждого заголовка.
Один вкладыш выглядит следующим образом и будет использоваться в цикле, где определено Slice
:
label = strjoin( strcat( headerNames', '=', ...
cellfun(@num2str,table2cell(Slice(1,headerNames)),'uni',0)' ), ', ');
% Output for Slice 1 of example 1 above: 'char=a, num=1, pet=dog'
% Output for Slice 1 of example 2 above: 'char=a'
% cellfun(@num2str, __ ) conversion not needed if there is no numeric data in the table