非数值数据是否与bsxfun等效?

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

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

最佳答案

恐怕细胞阵列还没有这样的等效物:-(

据我所知,您可以:

  • 遵循Oleg的建议并使用循环
  • 使用现有的实现,例如来自File Exchange的 mAryCellFcn csxfun
  • 滚动您自己的功能。例如,这是罗伯特(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针对单元阵列上的矢量化操作进行了优化,则后一种方法可能会更快。
  • 关于matlab - 对非数字数据使用 `bsxfun`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17090047/

    10-12 18:48