非数字数据是否等同于bsxfun
?
例如,我想比较存储在两个单元格数组中的所有字符串对:
>> a = {'aa', 'bb', 'cc'};
>> b = {'dd', 'aa'};
>> bsxfun( @strcmp, a, b' ); % not working for cells :-(
答案 0 :(得分:4)
我喜欢Rody's solution,但您 也可以执行以下解决方法:
ia=(1:length(a)).'; ib=1:length(b);
a=a(:);
bsxfun(@(ii,jj) strcmp( a(ii),b(jj) ) ,ia, ib);
答案 1 :(得分:3)
我担心细胞阵列没有这样的等价物: - (
据我所见,您可以:
mAryCellFcn
csxfun
滚动您自己的功能。例如,这里是罗伯特的想法的变体,适用于任何维度的输入(当然,在bsxfun
的限制下)和任意二元函数func
:
function C = mybsxfun(func, A, B)
idx_A = reshape(1:numel(A), size(A));
idx_B = reshape(1:numel(B), size(B));
C = bsxfun(@(ii, jj)func(A(ii), B(jj)), idx_A, idx_B);
如果您的函数可以按元素方式对整个单元格数组进行操作,则可以先在单元格数组上执行单例扩展,然后将它们直接提供给函数func
:
mask = bsxfun(@or, true(size(A)), true(size(B)));
idx_A = bsxfun(@times, mask, reshape(1:numel(A), size(A)));
idx_B = bsxfun(@times, mask, reshape(1:numel(B), size(B)));
C = func(A(idx_A), B(idx_B));
如果func
针对单元阵列上的矢量化操作进行了优化,则后一种方法可能会更快。
答案 2 :(得分:2)
怎么样
[str,ia,ib] = intersect(a,b)
答案 3 :(得分:2)
正如错误消息所示,广播仅适用于数字类型。以下是其他可能的替代方案:
a = {'aa', 'bb', 'cc'};
b = {'dd'; 'aa'};
%# obviously doesnt work
%#bsxfun(@strcmp, a, b)
%# do the singleton expansion ourselves
strcmp(repmat(a,size(b)), repmat(b,size(a)))
%# if you dislike REPMAT, we can use Tony's trick
strcmp(a(ones(size(b)),:), b(:,ones(size(a))))
%# we could also use CELLFUN
cell2mat(cellfun(@(s)strcmp(a,s), b, 'UniformOutput',false))