将bsxfun应用于具有多个输出参数的函数

时间:2017-12-10 01:00:18

标签: matlab function bsxfun

让我们假设我们有一个带有两个输出参数

的函数myfunction
function [ arg1, arg2 ] = myfunction( a, b )
arg1 = a*b;
arg2 = a+b;
end

我想将myfunction应用于向量AB

fun = @myfunction;
A = 1:10;
B = 1:17;
[C, D] = bsxfun(fun,A,B)

这会出错。如何将bsxfun用于具有多个输出参数的函数?

2 个答案:

答案 0 :(得分:2)

bsxfun生成正交矩阵/向量的所有组合的输出。因此,为了使您的示例适用于一个输出,您必须转置其中一个输入:

output1 = bsxfun(@myfunction,A,B.');

但正如rayryeng所评论的那样,bsxfun的问题在于它只能返回一个输出。正如评论中建议的Cris Luengo,您可以使用arrayfun。不同之处在于,对于arrayfun,您必须通过将输入1xN1xM向量扩展为NxM矩阵来显式生成所有输入组合:

对于Matlab 2016b及更高版本:

[output1, output2] = arrayfun(@myfunction,A.*ones(numel(B),1),B.'.*ones(1,numel(A)));

Matlab pre-2016b:

[output1, output2] = arrayfun(@myfunction,bsxfun(@times,A,ones(numel(B),1)),bsxfun(@times,B.',ones(1,numel(A))))

除了使用bsxfun扩展矩阵,您还可以使用repmat - 但通常是a bit slower

顺便说一句,如果你有一个有很多输出的功能而且不能用写[output1, output2, output3, ...] = ...来打扰你,你可以将它们保存在一个单元格中:

outputs = cell(nargout(@myfunction),1);
[outputs{:}] = arrayfun(@myfunction,....);

答案 1 :(得分:0)

您不能,bsxfun仅适用于binary operations