为什么我可以这样做:
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.
是否存在适用于这两种情况的替换功能?
答案 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