# How to vectorize strfind

4 visualizzazioni (ultimi 30 giorni)
Paolo Binetti il 22 Dic 2016
Modificato: Paolo Binetti il 23 Dic 2016
Is it possible to use strfind in a vectorized way? Suppose I want to get find not just one pattern inside a string, but several of them at the same time, so that the output would not be a vector of indexes, but a matrix: is it possible?
Concretely, take a string 'TRSDGHNENJRRDSENTRFDGDGT'. I want to find 'TR', 'DG', and 'EN'. The output of the function would be a matrix 3 x length(string) where line one are zeros and ones at indexes relative to 'TR', line two for 'DG' and line three for 'EN'. Possible?
The purpose is to avoid a for loop which even with pre-allocation is time-consuming. But I actually don't even know if this vectorization I am thinking of would be quicker.
##### 1 CommentoMostra -1 commenti meno recentiNascondi -1 commenti meno recenti
Image Analyst il 23 Dic 2016
Define quick for you. Exactly how long is your for loop solution taking? I can do around five hundred million iterations of a for loop in less than half a second. How many billions of iterations are you doing in your loop, and how long is it actually taking?

Accedi per commentare.

### Risposte (1)

Walter Roberson il 22 Dic 2016
In R2016b,
S = 'TRSDGHNENJRRDSENTRFDGDGT';
targets = ['TR'; 'DG'; 'EN'];
output = [targets(:,1) == S(1:end-1) & targets(:,2) == S(2:end), false(size(targets,1),1)];
In earlier versions you would need to use bsxfun()
##### 2 CommentiMostra NessunoNascondi Nessuno
Paolo Binetti il 23 Dic 2016
Modificato: Paolo Binetti il 23 Dic 2016
Thank you but I do not have these functions. On the other hand, I found that I can do it by converting the char array containing all the patterns to be searched into a cell array, and feed this to strfind. But the cell array is too memory-intensive, and the vectorized strfind is too slow, when applied to my problem (not the example).
Walter Roberson il 23 Dic 2016
The bsxfun version would be
output = [bsxfun(@eq, targets(:,1), S(1:end-1)) & bsxfun(@eq, targets(:,2), S(2:end)), false(size(targets,1),1)];
If you do not have bsxfun then you must be using a version before R2007a, and if you are then it is important for us to know that so that we do not keep suggesting features you cannot use.

Accedi per commentare.

### Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by