使用`bsxfun`表示非数字数据

时间:2013-06-13 14:45:46

标签: matlab bsxfun

非数字数据是否等同于bsxfun

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

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

4 个答案:

答案 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)

我担心细胞阵列没有这样的等价物: - (

据我所见,您可以:

  1. 关注Oleg的建议并使用循环
  2. 使用文件交换中的mAryCellFcn csxfun 等现有实施。
  3. 滚动您自己的功能。例如,这里是罗伯特的想法的变体,适用于任何维度的输入(当然,在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))