У меня есть следующие данные:
- массив ячеек меток (например, массив ячеек из 4 вариантов типов сообщений, где каждый тип представляет собой строку)
- массив ячеек сообщений (например, массив ячеек из 5000 сообщений, где каждое сообщение представляет собой массив ячеек из множества строк слов).
- массив ячеек меток для каждого сообщения (например, массив ячеек из 5000 строк, где строка в ячейке i является типом сообщения в ячейке i в массиве в части 2).
Моя цель - получить из этих данных массив ячеек размером с число меток, где в каждой ячейке есть объединенное содержимое из всех сообщений типа в качестве метки (например, получить массив ячеек из 4 ячеек, где в ячейке i есть массив ячеек всех слов из всех сообщений, тип которых i).
Я реализовал 3 метода для выполнения этого. Это код для моих трех реализаций:
%...............................................................
% setting data for tic toc tests
messagesTypesOptions = {'type1';'type2';'type3';'type4'};
messages = cell(5000,1);
for i = 1:5000
messages{i} = {'word1';'word2';'word3';'word4';'word5';'word6';'word7';'word8';'word9';'word10'};
end
messages_labels = cell(5000,1);
for i = 1:5000
messages_labels{i} = messagesTypesOptions{randi([1 4])};
end
%...............................................................
% start test
% method 1
type_to_msgs1 = cell(size(messagesTypesOptions,1),1);
tic
for i = 1:size(messagesTypesOptions,1)
type_to_msgs1{i} = messages(strcmp(messages_labels,messagesTypesOptions{i}));
end
type_to_concatenated1 = cell(4,1);
for i = 1:4
type_to_msgs1{i} = type_to_msgs1{i}';
end
for i =1:4
label_msgs = type_to_msgs1{i};
num_of_label_msgs = size(label_msgs,2);
for j = 1: num_of_label_msgs
label_msgs{j} = label_msgs{j}';
end
type_to_concatenated1{i} = [label_msgs{:}];
end
toc
% method 2
type_to_concatenated2 = cell(4,1);
tic
labelStr_to_labelIndex = containers.Map(messagesTypesOptions,1:4);
for textIndex = 1:5000
type_to_concatenated2{labelStr_to_labelIndex(messages_labels{textIndex})} = ...
[type_to_concatenated2{labelStr_to_labelIndex(messages_labels{textIndex})},...
messages{textIndex}'];
end
toc
% method 3
type_to_concatenated3 = cell(4,1);
tic
labelStr_to_labelIndex2 = containers.Map(messagesTypesOptions,1:4);
matrix_label_to_isMsgFromLabel = zeros(4,5000);
for textIndex = 1:5000
matrix_label_to_isMsgFromLabel(labelStr_to_labelIndex2(messages_labels{textIndex})...
,textIndex) = 1;
end
for i = 1:4
label_msgs3 = messages(~~matrix_label_to_isMsgFromLabel(i,:))';
num_of_label_msgs3 = size(label_msgs3,2);
for j = 1: num_of_label_msgs3
label_msgs3{j} = label_msgs3{j}';
end
type_to_concatenated3{i} = [label_msgs3{:}];
end
toc
Вот результаты, которые я получаю:
Прошедшее время составляет 0,033120 секунд.
Прошедшее время составляет 0,471959 секунды.
Прошедшее время составляет 0,095011 секунды.
Итак, вывод такой, что способ 1 самый быстрый.
Теперь мой вопрос: есть ли способ решить эту проблему быстрее?
Интуитивно кажется, что мой метод1 не очень эффективен, потому что он имеет цикл for с strcmp
, а strcmp
читает все сообщения, поэтому он читает количество меток, умноженное на все сообщения, т.е. читает < em>количество ярлыков (типов) то же самое.
Итак, есть ли способ изменить один из моих методов, чтобы получить более быстрое решение? Есть ли другой метод, который быстрее?
EDIT: Здесь я использовал для примеров постоянные сообщения. Но мне нужно решение для случая, когда сообщения отличаются друг от друга и могут иметь разный размер.
EDIT2: Кроме того, типы — это строки, которые не обязательно содержат числа. (например, вместо type1, type2,..., которые я использовал для кода примера, это может быть «ошибка», «предупреждение», «действительно»).
for
, содержащиеtype_to_msgs1{i} = type_to_msgs1{i}';
иlabel_msgs{j} = label_msgs{j}';
? - person knedlsepp   schedule 20.12.2014