MATLAB Answers

John Doe
3

Using bsxfun for non-numeric data

Asked by John Doe
on 13 Jun 2013
Latest activity Commented on by Matt J
on 20 Nov 2019 at 14:29
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 Comments

Sign in to comment.

Tags

3 Answers

Answer by Matt J
on 13 Jun 2013
Edited by Matt J
on 13 Jun 2013
 Accepted Answer

Here's a way you could still do the comparison in the "string domain",
>> ia=(1:length(a)).'; ib=1:length(b);
>> a=a(:);
>> bsxfun(@(i,j) strcmp( a(i),b(j) ) ,ia, ib)
ans =
0 1
0 0
0 0

  0 Comments

Sign in to comment.


Answer by Sean de Wolski
on 13 Jun 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 Comment

David Young
on 20 Nov 2019 at 11:56
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.

Sign in to comment.


Answer by Steven Lord
on 20 Nov 2019 at 14:22

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 Comment

Matt J
on 20 Nov 2019 at 14:29
Didn't know that implicit expansion applies to non-numeric types! That should get more documentation.

Sign in to comment.