多命令合一,Matlab

Multiple commands in one, Matlab

有时希望在一条命令中进行多次调用。一个简单的例子可以是 strrep。假设您要将所有括号替换为方括号,将所有逗号替换为点,然后删除所有双引号。然后可能需要以下伪代码:

strrep(myString, '()', '[]', ',', '.', '"', '')

有什么办法可以实现吗?你当然可以选择:

strrep(strrep(strrep(myString, '()', '[]'), ',', '.'), '"', '')

或者将字符串保存在元胞数组中并在 for 循环中使用它,但这两种解决方案都非常难看。

最想要的答案是对所有以类似方式工作的函数通用的答案。

要直接回答你的问题,确实没有一致的做法,没有。这真的取决于功能。如果您搜索文档,您通常会找到一种方法来执行此操作。至少对于字符串,您通常可以传递元胞数组代替字符串来对多个字符串执行操作,在本例中,对 same 字符串执行多个操作。

此特定示例的解决方案

您可以轻松地使用 regexprep 为您完成此操作。您可以传递表达式的元胞数组以与相应的替换值元胞数组相匹配。

regexprep('abc', {'a', 'b', 'c'}, {'1', '2', '3'});

%// '123'

对于您的具体示例,您可以执行以下操作:

regexprep(myString, {'\(\)', ',', '"'}, {'[]', '.', ''})

举个例子:

myString = 'This, is a () "string"';
regexprep(myString, {'\(\)', ',', '"'}, {'[]', '.', ''})

%// 'This. is a [] string'

如果您不想担心将所有表达式转义为正则表达式兼容,您可以使用 regexptranslate 为您完成。

expressions = regexptranslate('escape', {'()', ',', '"'});
regexprep(myString, expressions, {'[]', '.', ''});

正如@Suever 已经说过的,您的示例可以通过 regexprep 解决,@thewaywewalk 暗示没有针对所有函数调用的 "general" 解决方案。

请注意,我不提倡将此作为编码的好方法 -> 但这是一个古怪的问题,因此这里有一个合适的古怪解决方案....

您不应该这样做的原因有很多 - 即调试的噩梦,但理论上您可以使用 "intelligent" 自调用函数来做到这一点...

% Create your own function which takes the following inputs:
%     fHandle  - function handle to the function of choice
%     property - your starting variable
%     varargin - a cell array (or single var) of variables to 
%                pass into the fHandle on each call
%  see examples below...
function output = multipleCalls ( fHandle, property, varargin )
  % call your primary function using feval and your inputs
  %   with the 1st group of inputs from the 1st varargin
  if iscell ( varargin{1} )
    output = feval ( fHandle, property, varargin{1}{:} );
  else
    output = feval ( fHandle, property, varargin{1} );
  end
  % remove the varargin variable which has just been used.
  varargin(1) = [];
  % are they aremore multiple call?
  if ~isempty ( varargin )
    % if so self call to apply the subsequent calls.
    output = multipleCalls ( fHandle, output, varargin{:} );
  end
end


% modifying your example to use this method:
multipleCalls( @strrep, 'This, is a () "string"', { '()', '[]' }, { ',', '.' }, { '"', '' } )
% Its probably a longer command and is it any clearer -> probably not...

% Here is another example:
% Create a silly anonymous function
sillyFunction = @(a,b) a + b

% Then you can use it in the same way:
% Where 0 is what you start with and then
%  each time you want to add 1, then 2, then 3 and finally 4
multipleCalls ( sillyFunction, 0, 1, 2, 3, 4 )

假设您希望函数 foo 像这样工作:

foo(Variable,Parameter1,Value1);
foo(Variable,Parameter1_1,Value1,Parameter2,Value2,...);

然后使用递归:

function[Variable]=FooBar(Variable,varargin)
N=nargin-1;                  %\ Count the input parameters
if N>=2
  Parameter=varargin{1};      
  Value=varargin{2};
  % Process the first Parameter-value pair
  Variable=FooBar(Variable,varargin{3:N}); %\ Cut first Parameter-Value pair off and pass the rest to foo again 

end

此方法允许您使用单个参数、对、三元组、四元组等的链。

在这个特殊的例子中,这些对作为 LIFO 堆栈执行,最后一个未配对的 Parameter 被忽略。您还可以添加一些条件来实现 foo(IN,Parameter1,Value1,Modifier,Parameter2,Value2,...) 和许多其他属性...

对于您的具体示例:

function[MyString]=FooBar(MyString,varargin)
N=nargin-1;                  %\ Count the input parameters
if N>=2
  Parameter=varargin{1};
  Value=varargin{2};
  MyString=regexprep(MyString,Parameter,Value)
  MyString=FooBar(MyString,varargin{3:N});%\ Cut first Parameter-Value pair off and pass the rest to foo again 

end

示例:

>> myString='This, is a () "string"';
FooBar(myString,'()','[]','"','',',','.')
ans = This. is a [] string

>> myString='This, is a  ("string")';
FooBar(myString,'()','[]','"','',',','.')
ans = This. is a  (string)

>> myString='This, is a  ("string")';
FooBar(myString,'(','[',')',']','"','',',','.')
ans = This. is a  [string]