Matlab - 单输出扩展两个以上的输入

Ank*_*kar 7 matlab vectorization bsxfun

我有一个函数,它接收2个以上的变量

例如.

testFunction = @(x1, x2, x3, x4) x1.*x2.*x3.*x4;
testFunction2 = @(x1, x2, x3) sin(x1.*x2.^x3);
Run Code Online (Sandbox Code Playgroud)

有没有可用的功能bsxfun允许单个扩展功能有多于2个输入?

的例子 bsxfun

binaryTestFunction = @(x1, x2) x1.*x2;
x1 = 9*eye(10);
x2 = 3*ones(10,1);
A = bsxfun(binaryTestFunction , x1 , x2);
Run Code Online (Sandbox Code Playgroud)

扩展x2向量中的单例维度.
bsxfun比repmat更快,也是高度迭代的,因此我想知道单例扩展testFunction是否可行.

Dan*_*iel 2

您可以定义自己的类来自动使用 bsxfun:

classdef bdouble < double
    %BDOUBLE double with automatic broadcasting enabled

    methods
        function obj=bdouble(data)
            obj = obj@double(data);
        end
        function r=plus(x,y)
            r=bsxfun(@plus,x,y);
        end
        function r=minus(x,y)
            r=bsxfun(@minus,x,y);
        end
        function r=power(x,y)
            r=bsxfun(@power,x,y);
        end
        function r=times(x,y)
            r=bsxfun(@times,x,y);
        end
        function r=rdivide(x,y)
            r=rdivide(@rdivide,x,y);
        end
        function r=ldivide(x,y)
            r=ldivide(@ldivide,x,y);
        end 
    end
end
Run Code Online (Sandbox Code Playgroud)

用法:

 testFunction(bdouble([1:3]),bdouble([1:4]'),bdouble(cat(3,1,1)),bdouble(1))
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢 bsxfun 语法,可以将其放在顶部:

function varargout=nbsxfun(fun,varargin)
varargout=cell(1:nargout);
for idx=1:numel(varargin)
    if isa(varargin{idx},'double')
        varargin{idx}=bdouble(varargin{idx});
    end
end
varargout{1:max(nargout,1)}=fun(varargin{:});
end
Run Code Online (Sandbox Code Playgroud)

例子:

n=nbsxfun(testFunction,[1:3],[1:4]',cat(3,1,1),4)
Run Code Online (Sandbox Code Playgroud)