让我们假设我们有一个带有两个输出参数
的函数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
用于具有多个输出参数的函数?
答案 0 :(得分:2)
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)));
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