单个扩展超过两个输入

我有一个函数需要超过2个变量

例如。

testFunction = @(x1, x2, x3, x4) x1.*x2.*x3.*x4;
testFunction2 = @(x1, x2, x3) sin(x1.*x2.^x3);

是否有像bsxfun这样的功能,允许单数扩展功能多于2个输入?

bsxfun例子

binaryTestFunction = @(x1, x2) x1.*x2;
x1 = 9*eye(10);
x2 = 3*ones(10,1);
A = bsxfun(binaryTestFunction , x1 , x2);

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


你可以定义你自己的类,它可以自动使用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

用法:

 testFunction(bdouble([1:3]),bdouble([1:4]'),bdouble(cat(3,1,1)),bdouble(1))

如果你喜欢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

例:

n=nbsxfun(testFunction,[1:3],[1:4]',cat(3,1,1),4)

只是巢功能:

testFunction = @(x1, x2, x3, x4) bsxfun(@times, bsxfun(@times, bsxfun(@times, x1, x2), x3), x4);
testFunction2 = @(x1, x2, x3) sin(bsxfun(@power, bsxfun(@times, x1, x2), x3);

请注意,您应该在函数内部实现bsxfun,而不是依赖用户使用bsxfun调用函数,因此无论如何与函数的交互都是无缝的。

还要注意,当使用直接元素操作时,在使用bsxfun之间几乎没有速度惩罚。

文件交换中有一个文件覆盖了数组运算符,因此bsxfun被所有运算符自动使用,但我不记得它的名字。 我使用了一段时间,但是这会让用户不知道这是已经实现的风险。

链接地址: http://www.djcxy.com/p/25351.html

上一篇: Singleton expansion for more than two inputs

下一篇: What is `base value` of `reference` in ECMAScript(ECMA