将 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与具有多个输出参数的函数一起使用?

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)));

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仅用于二进制操作

相关内容

  • 没有找到相关文章

最新更新