将 bsxfun 应用于具有多个输出参数的函数
Applying bsxfun to function with multiple output arguments
让我们假设我们有一个带有两个输出参数
的函数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
仅适用于 binary operations
bsxfun
从正交矩阵/向量的所有组合生成输出。因此,为了使您的示例即使是一个输出也能工作,您必须转置其中一个输入:
output1 = bsxfun(@myfunction,A,B.');
但如rayryeng commented, the problem with bsxfun is that it can return only one output. As Cris Luengo suggested in a comment you can instead use 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
- but that's generally a bit slower.
顺便说一句,如果你有一个有很多输出的函数并且不想写 [output1, output2, output3, ...] = ...
你可以将它们保存在一个单元格中:
outputs = cell(nargout(@myfunction),1);
[outputs{:}] = arrayfun(@myfunction,....);
让我们假设我们有一个带有两个输出参数
的函数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
仅适用于 binary operations
bsxfun
从正交矩阵/向量的所有组合生成输出。因此,为了使您的示例即使是一个输出也能工作,您必须转置其中一个输入:
output1 = bsxfun(@myfunction,A,B.');
但如rayryeng commented, the problem with bsxfun is that it can return only one output. As Cris Luengo suggested in a comment you can instead use 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
- but that's generally a bit slower.
顺便说一句,如果你有一个有很多输出的函数并且不想写 [output1, output2, output3, ...] = ...
你可以将它们保存在一个单元格中:
outputs = cell(nargout(@myfunction),1);
[outputs{:}] = arrayfun(@myfunction,....);