是否有适用于结构数组的bsxfun版本?

时间:2016-11-06 00:05:42

标签: matlab struct bsxfun

为什么我可以这样做:

a = [1 2];
b = [3 4];
bsxfun(@(ai,bj) ai + bj, a, b')
% 4     5
% 5     6

但不是这样:

a = struct('x', {1 2});
b = struct('x', {3 4});
bsxfun(@(ai,bj) ai.x + bj.x, a, b');
% Error using bsxfun
% Operands must be numeric arrays.

是否存在适用于这两种情况的替换功能?

2 个答案:

答案 0 :(得分:1)

这可能不是一般解决方案 * 但是对于您的特定示例,使用{{3将结构数组转换为 bsxfun内的数字数组很容易然后使用原始的匿名函数,即

>> bsxfun(@(ai, bj) ai+bj, [a.x], [b.x]')
ans =
     4     5
     5     6

并且这应该仍然利用bsxfun赋予的计算效率(例如,与慢得多的“repmat + arrayfun”方法相反)。

<小时/> * <子> e.g。如果您的字段包含数组而不是标量,则它可能无法正常工作,因为扩展到逗号分隔列表将是不同的

答案 1 :(得分:0)

一个hacky解决方法:

function res = bsxfun_struct(f, A, B)
    % best way to ensure our output size matches the behaviour of bsxfun is just to call it
    dummy = bsxfun(@(ai, bj) ai+bj, zeros(size(A)), zeros(size(B)));
    res_size = size(dummy);

    % repeat the matrices as needed
    Arep = repmat(A, res_size ./ size(A));
    Brep = repmat(B, res_size ./ size(B));

    % now we can just apply the function pairwise
    res = arrayfun(f, Arep, Brep);
end