Using bsxfun for non-numeric data
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Is there an equivalent to bsxfun for non-numeric data?
For example, I want to compare all pairs of strings stored in two cell-arrays:
a = {'aa', 'bb', 'cc'};
b = {'dd', 'aa'};
bsxfun( @strcmp, a, b' ); % not working for cells
I want something like this:
bsxfun(@eq, 1:3, (1:4)')
ans =
1 0 0
0 1 0
0 0 1
0 0 0
0 commentaires
Réponse acceptée
Plus de réponses (2)
Sean de Wolski
le 13 Juin 2013
Yes, bsxfun only supports numeric datatypes.
Here's the workaround I would take: Use unique to convert to numbers and eq as the comparison:
a = {'aa', 'bb', 'cc'};
b = {'dd', 'aa'};
[~,~,idx] = unique([a(:); b(:)],'stable'); %equal numbers instead of strings
ee = bsxfun(@eq,idx(1:numel(a))',idx(numel(a)+1:end));
1 commentaire
David Young
le 20 Nov 2019
It seems like a completely unnecessary restriction for bsxfun to only accept numeric arrays - the function passed as the first argument must surely do its own checking anyway. The trick of using unique is neat, but it's a real shame it's necessary, and it's still not general. You could make bsxfun more powerful simply by taking out the check. All that's needed is that the results can be assembled into an array as arrayfun does.
Steven Lord
le 20 Nov 2019
For this specific example, you can now take advantage of implicit expansion and the string type.
>> a = {'aa', 'bb', 'cc'};
>> b = {'dd', 'aa'};
>> string(a) == string(b).'
ans =
2×3 logical array
0 0 0
1 0 0
1 commentaire
Matt J
le 20 Nov 2019
Didn't know that implicit expansion applies to non-numeric types! That should get more documentation.
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!