多命令合一,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]
有时希望在一条命令中进行多次调用。一个简单的例子可以是 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]