让我们假设我们有一个带有两个输出参数的函数myfunction
function [ arg1, arg2 ] = myfunction( a, b )
arg1 = a*b;
arg2 = a+b;
end
我想将myfunction
应用于矢量A
和B
:
fun = @myfunction;
A = 1:10;
B = 1:17;
[C, D] = bsxfun(fun,A,B)
这会产生错误。如何将bsxfun
与具有多个输出参数的函数一起使用?
bsxfun
从正交矩阵/向量的所有组合生成输出。因此,为了使您的示例适用于甚至一个输出,您必须转置其中一个输入:
output1 = bsxfun(@myfunction,A,B.');
但正如 rayryeng 评论的那样,bsxfun 的问题在于它只能返回一个输出。正如Cris Luengo在评论中建议的那样,您可以使用arrayfun
。不同之处在于,对于arrayfun
,您必须通过将输入1xN
和1xM
向量扩展到NxM
矩阵来显式生成所有输入组合:
对于 Matlab 2016b 及更高版本:
[output1, output2] = arrayfun(@myfunction,A.*ones(numel(B),1),B.'.*ones(1,numel(A)));
2016b之前的Matlab:
[output1, output2] = arrayfun(@myfunction,bsxfun(@times,A,ones(numel(B),1)),bsxfun(@times,B.',ones(1,numel(A))))
除了使用 bsxfun 来扩展矩阵之外,您还可以使用repmat
- 但这通常有点慢。
顺便说一句,如果你有一个有很多输出的函数,并且不能为编写[output1, output2, output3, ...] = ...
而烦恼,你可以将它们保存在一个单元格中:
outputs = cell(nargout(@myfunction),1);
[outputs{:}] = arrayfun(@myfunction,....);
你不能,bsxfun
仅用于二进制操作