2013-07-16 2 views
0

Я хотел бы найти вектор строк в двух столбцах массива ячеек строк A (300.000 x 7).Matlab более эффективное решение для поиска строк в массиве ячеек

string=[53716;59428;58221;679854]. 

Здесь ниже код:

y=arrayfun(@(x)~cellfun(@isempty,regexp(A(:,3:4),string(x))),1:numel(string),'uni',false); 

y=cat(1,y{:}); 

Этот вопрос похож на How to search for a string in cell array in MATLAB? и это один Searching cell array with regex

Однако это решение занимает несколько часов. Кто-нибудь знает более эффективный способ выполнения одной и той же операции?

+0

То, что у вас есть, не является вектором строк. О, а вместо 'cellfun (@isempty, ...)' use 'cellfun ('isempty', ...)'. Он должен работать намного быстрее. –

+0

Спасибо, но он все еще очень медленный. – seli

ответ

2

Вы сравниваете строки с удвоением («строка» представляет собой двойной массив); это то, что вы хотите сделать? Если нет, то вы могли бы использовать string_chars=arrayfun(@(x) sprintf('%d',string(x)),1:length(string),'uni',false);

Чтобы избежать регулярных выражений, вы можете использовать STRCMP:

result = zeros(size(A(:,3:4))); 
for v=1:length(string_chars) 
    result=result+v.*strcmp(A(:,3:4),string_chars(x)); % Should string be a cell here, btw? 
end 

Я не знаю, складывая результаты, как я делаю здесь подходит для вашего использования, но вы можете адаптировать, как необходимо. Это приведет к тому, что элементы результата будут соответствовать каждому элементу string_chars.

+0

+1. Если требуется больше скорости, избегайте медленной реализации регулярного выражения Matlab, особенно для простых сравнений, подобных этому. И, конечно, никогда не бойтесь «за» петли. – horchler

Смежные вопросы