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

Sha*_*hai 5 matlab bsxfun

是否有相当于bsxfun非数字数据?

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

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

Eit*_*n T 3

恐怕元胞数组没有这样的等价物:-(

据我所知,您可以:

  1. 遵循 Oleg 的建议并使用循环
  2. 使用现有的实现,例如文件交换来自文件交换。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);
    
    Run Code Online (Sandbox Code Playgroud)

    如果您的函数可以按元素对整个元胞数组进行操作,则可以首先对元胞数组执行单例扩展,然后将它们直接提供给函数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));
    
    Run Code Online (Sandbox Code Playgroud)

    func如果针对元胞数组上的矢量化操作进行优化,后一种方法可能会更快。

  • `csxfun` 不好;这只是“cellfun”,仅此而已。不过“maryCellFcn”看起来不错...... (2认同)