正如@Adriaan所说,最好使用struct
来存储这种类型的数据。然后您可以使用这些结构对其进行分组。以下代码假定您在所有文件名中具有一致数量的部分。
names = {'blahblah.speaker.4.id.55', ...
'blahblah.speaker.4.id.66', ...
'blah.listener.3.id.77'};
output = regexp(names, '\.', 'split');
output = cat(1, output{:});
% Fieldnames for each of the "parts"
names = {'blah_part', 'attendee_type', 'some_number', 'id', 'id_number'};
% Now convert it to a struct
data = cell2struct(output.', names);
3x1 struct array with fields:
blah_part
attendee_type
some_number
id
id_number
现在让我们将该id_number转换为真实的数字。
id_numbers = num2cell(str2double({data.id_number}));
[data.id_number] = deal(id_numbers{:});
现在我们可以对此执行操作。
找到所有情况下,第一部分是“blahblah”
inds = strcmp({data.blah_part}, 'blahblah');
data_with_blahblah = data(inds);
2x1 struct array with fields:
blah_part
attendee_type
some_number
id
id_number
可以为任何字段的做到这一点。如果你的字段包含数字(你所有的都是字符串)。你可以做类似的事情。
sub_data = data([data.id_number] == 55);
blah_part: 'blahblah'
attendee_type: 'speaker'
some_number: '4'
id: 'id'
id_number: 55
如果你不反对regular expressions,你还可以创建structure
的方式。
data = regexp(names, '(?<blah_part>.*?)\.(?<attendee_type>.*?)\.(?<some_number>\d*)\.(?<id>.*?)\.(?<id_number>\d*)', 'names')
不要使用电池,使用['structure'(http://mathworks.com/help/matlab/ref/struct.html) – Adriaan
澄清一下,我用一个结构来获取所有最初的文件名称,但我需要根据扬声器分隔符将这些文件名分组。可能会有multipel文件与相同的扬声器。所以我使用names = {filestruct {:}。name}创建了一个文件名的单元格; – user3772547