5

bsxfun非数字数据是否有等价物?

例如,我想比较存储在两个单元格数组中的所有字符串对:

>> a = {'aa', 'bb', 'cc'};
>> b = {'dd', 'aa'};
>> bsxfun( @strcmp, a, b' ); % not working for cells :-(
4

4 回答 4

4

我喜欢罗迪的解决方案,但你可以做这样的解决方法:

ia=(1:length(a)).'; ib=1:length(b);
a=a(:);
bsxfun(@(ii,jj) strcmp(  a(ii),b(jj) )  ,ia, ib);
于 2013-06-13T16:24:51.503 回答
3

恐怕单元阵列没有这样的等价物:-(

据我所知,您可以:

  1. 遵循 Oleg 的建议并使用循环
  2. 使用现有的实现,例如来自 File Exchange。mAryCellFcn csxfun
  3. 滚动你自己的函数。例如,这是 Robert 想法的一个变体,适用于任何维度的输入(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如果针对元胞数组上的矢量化操作进行了优化,后一种方法可能会更快。

于 2013-06-13T15:28:48.287 回答
2

怎么样

[str,ia,ib] = intersect(a,b)

?

于 2013-06-13T16:13:30.110 回答
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))
于 2013-06-14T00:39:23.747 回答