Function 在matlab中将双输入函数转换为变长输入函数的巧妙方法

Function 在matlab中将双输入函数转换为变长输入函数的巧妙方法,function,matlab,arguments,Function,Matlab,Arguments,这只是一个出于兴趣的问题。假设我有一个二进制函数,它接受平方矩阵并输出相同大小的平方矩阵(或者更一般地说,它的输入类型和大小与其输出类型和大小相同): mtimes函数就是一个例子。将其转换为可变长度输入函数有哪些不同且聪明的方法 function C = myfunc_multi(varargin) 以致 myfunc(A{1},myfunc(A{2},myfunc(A{3},...myfunc(A{end-1},A{end})...))) == myfunc_multi(A{:}

这只是一个出于兴趣的问题。假设我有一个二进制函数,它接受平方矩阵并输出相同大小的平方矩阵(或者更一般地说,它的输入类型和大小与其输出类型和大小相同):

mtimes函数就是一个例子。将其转换为可变长度输入函数有哪些不同且聪明的方法

function C = myfunc_multi(varargin)
以致

myfunc(A{1},myfunc(A{2},myfunc(A{3},...myfunc(A{end-1},A{end})...))) == 
    myfunc_multi(A{:})
?

这是我想到的第一个通用解决方案(编辑:除了递归或循环之外):

然后你可以用类似的东西来测试它

A = {rand(3) rand(3) rand(3) rand(3) rand(3)};
multioutput(@mtimes,A{:})-A{1}*A{2}*A{3}*A{4}*A{5}

来测试它。您能想到其他方法吗?

可能没有很好的理由来避免明显的递归构造。它很简单,易于阅读和维护,应该有相当好的性能

function out = aggregate_inputs(fHandle, varargin)
if nargin>3
    out = fHandle(varargin{1},aggregate_inputs(fHandle,varargin{2:end}));
elseif nargin <= 3
    out = fHandle(varargin{:});
end
function out=聚合输入(fHandle,varargin)
如果nargin>3
out=fHandle(varargin{1},聚合输入(fHandle,varargin{2:end}));

elseif nargin可能没有很好的理由来避免明显的递归构造。它很简单,易于阅读和维护,应该有相当好的性能

function out = aggregate_inputs(fHandle, varargin)
if nargin>3
    out = fHandle(varargin{1},aggregate_inputs(fHandle,varargin{2:end}));
elseif nargin <= 3
    out = fHandle(varargin{:});
end
function out=聚合输入(fHandle,varargin)
如果nargin>3
out=fHandle(varargin{1},聚合输入(fHandle,varargin{2:end}));

elseif nargin很抱歉,但通过复杂使用arrayfun、regexprep和eval来避免一个简单的循环是愚蠢的。学会在适当的时候编写简单的代码。这里的循环就是这样。这种混乱不会在评估中节省任何时间,但如果您需要调试它,它将是完全混乱的。此外,我建议不要使用递归(因为您提到过它)。浪费时间和记忆。@woodchips,@yuk:正如我所说的,这个问题没有兴趣。与任何编程语言一样,我喜欢看到整洁的技巧,以及可以完成事情的迂回或意外的方式。我想的更多的是实用性,而不是实用性。当我实际使用Matlab进行计算时,我确实编写了“简单代码”。对不起,通过复杂地使用arrayfun、regexprep和eval来避免一个简单的循环是愚蠢的。学会在适当的时候编写简单的代码。这里的循环就是这样。这种混乱不会在评估中节省任何时间,但如果您需要调试它,它将是完全混乱的。此外,我建议不要使用递归(因为您提到过它)。浪费时间和记忆。@woodchips,@yuk:正如我所说的,这个问题没有兴趣。与任何编程语言一样,我喜欢看到整洁的技巧,以及可以完成事情的迂回或意外的方式。我想的更多的是实用性,而不是实用性。当我实际使用Matlab进行计算时,我确实写了“简单代码”。我的想法很可能不正确,但我假设您打算将
out=fhandle(varargin{1},aggregate_input(fhandle,varargin{2:end}))
作为第一个函数中的递归步骤。我很可能没有正确的想法,但是我假设您打算将
out=fhandle(varargin{1},aggregate_输入(fhandle,varargin{2:end}))
作为第一个函数中的递归步骤。
function out = aggregate_inputs(fHandle, varargin)
if nargin>3
    out = fHandle(varargin{1},aggregate_inputs(fHandle,varargin{2:end}));
elseif nargin <= 3
    out = fHandle(varargin{:});
end
function accumulate = aggregate_inputs(fHandle,varargin)
if nargin<=3
    accumulate  = fHandle(varargin{:});
else
    accumulate = fHandle(varargin{end-1},varargin{end});
    for ix = (length(varargin)-2):-1:1
       acumulate = fHandle(varargin{ix}, accumulate);
    end
end