Matlab-在每行之后执行操作
有没有一种优雅的方法可以让matlab在执行某个脚本中的每一行之后执行预定义的操作?所谓优雅,我的意思是在每一行之后都不调用动作,而是在脚本的开头给出一个简单的命令 例如: 动作-->Matlab-在每行之后执行操作,matlab,Matlab,有没有一种优雅的方法可以让matlab在执行某个脚本中的每一行之后执行预定义的操作?所谓优雅,我的意思是在每一行之后都不调用动作,而是在脚本的开头给出一个简单的命令 例如: 动作-->disp(“执行动作”) 脚本: a = 1; b = 2; c = 3; 因此,理想的结果是,在每次赋值(a、b和c)之后,都会执行disp()命令 a = 1; disp('Performing Action'); b = 2; disp('Performing Action'); c = 3; disp('
disp(“执行动作”)代码>
脚本:
a = 1;
b = 2;
c = 3;
因此,理想的结果是,在每次赋值(a、b和c)之后,都会执行disp()命令
a = 1;
disp('Performing Action');
b = 2;
disp('Performing Action');
c = 3;
disp('Performing Action');
或者,如果你可以在一个循环中这样做
for ii = 1:3
a(ii) = ii;
disp('Performing Action');
end
实际上,让它在每一行之后都输出一些东西并不是很好,但是如果你想跟踪你在脚本中的位置,你当然可以去掉所有的分号,从而让它显示所有的变量
我建议在代码中使用verbose
开关。将其设置为0表示无输出,将其设置为1表示输出(或根据需要使用多个级别)
通过这种方式,您可以根据需要轻松地打开或关闭输出
有关代码阅读和附加部分,请参阅Louis Mendo的答案,网址为
或者,如果你可以在一个循环中这样做
for ii = 1:3
a(ii) = ii;
disp('Performing Action');
end
实际上,让它在每一行之后都输出一些东西并不是很好,但是如果你想跟踪你在脚本中的位置,你当然可以去掉所有的分号,从而让它显示所有的变量
我建议在代码中使用verbose
开关。将其设置为0表示无输出,将其设置为1表示输出(或根据需要使用多个级别)
通过这种方式,您可以根据需要轻松地打开或关闭输出
有关代码阅读和附加部分,请参见Louis Mendo的答案,网址为不,没有
您在原始问题中介绍的只是=
运算符的简单用法
如果您想超载Matlab的默认行为,那么您应该考虑创建类并定义每个操作符或所需函数所需的行为。 不,没有
您在原始问题中介绍的只是=
运算符的简单用法
如果您想超载Matlab的默认行为,那么您应该考虑创建类并定义每个操作符或所需函数所需的行为。 您可以自动创建一个已修改的文件,该文件在每行末尾包含所需的操作:
action = 'disp(''Performing Action'');'; %// action to be added at the end of each line
file = 'script.m'; %// original script
file_out = 'script_out.m'; %// modified script with action added
x = importdata(file); %// cell array of strings. Each line of the
%// original file is a string
x = strcat(x, {' ; '}, action); %// add action at the end of each string,
%// preceded with `;` in case the original line
%// didn't include that
fid = fopen(file_out, 'w');
fprintf(fid, '%s\n', x{:}); %// write output file
fclose(fid);
您可以自动创建一个已修改的文件,该文件在每行末尾包含所需的操作:
action = 'disp(''Performing Action'');'; %// action to be added at the end of each line
file = 'script.m'; %// original script
file_out = 'script_out.m'; %// modified script with action added
x = importdata(file); %// cell array of strings. Each line of the
%// original file is a string
x = strcat(x, {' ; '}, action); %// add action at the end of each string,
%// preceded with `;` in case the original line
%// didn't include that
fid = fopen(file_out, 'w');
fprintf(fid, '%s\n', x{:}); %// write output file
fclose(fid);
这是我的尝试。你可以:
- 逐行阅读函数
- 执行每一行,然后执行自定义函数
注意
- 这不适用于包含
for
,if
等的函数
- 通过将带有自定义操作的函数处理程序传递给
runEachLine
(以及feval
),最终可以改进代码
这里是一个代码示例(部分基于):
富美
runEachLine.m
function runEachLine( mfile, args )
if nargin < 1
error('No script m-file specified.');
end
if ~strcmp(mfile(end-1:end),'.m')
mfile = [mfile '.m'];
end
if ~exist(mfile,'file')
error(['Cannot access ' mfile])
end
% Read function file
M = textread(mfile,'%s','delimiter','\n');
% Remove empty lines
M = M(~cellfun('isempty',M));
% Input arguments
assignin('base', 'args', args);
% Skipping first line: function [...] = func_name(...)
% Skipping last line : end
for k=2:length(M)-1
try
% Execute each line
evalin('base',M{k})
% Execute your custom function
disp(['Performing Action: ' M{k}]);
catch ME
error('RunFromTo:ScriptError',...
[ME.message '\n\nError in ==> ' mfile ' at ' num2str(k) '\n\t' M{k}]);
end
end
end
结果:
>> runEachLine('foo.m', {4})
Performing Action: a = args{1};
Performing Action: b = 2;
Performing Action: c = a + b;
>>
这是我的尝试。你可以:
- 逐行阅读函数
- 执行每一行,然后执行自定义函数
注意
- 这不适用于包含
for
,if
等的函数
- 通过将带有自定义操作的函数处理程序传递给
runEachLine
(以及feval
),最终可以改进代码
这里是一个代码示例(部分基于):
富美
runEachLine.m
function runEachLine( mfile, args )
if nargin < 1
error('No script m-file specified.');
end
if ~strcmp(mfile(end-1:end),'.m')
mfile = [mfile '.m'];
end
if ~exist(mfile,'file')
error(['Cannot access ' mfile])
end
% Read function file
M = textread(mfile,'%s','delimiter','\n');
% Remove empty lines
M = M(~cellfun('isempty',M));
% Input arguments
assignin('base', 'args', args);
% Skipping first line: function [...] = func_name(...)
% Skipping last line : end
for k=2:length(M)-1
try
% Execute each line
evalin('base',M{k})
% Execute your custom function
disp(['Performing Action: ' M{k}]);
catch ME
error('RunFromTo:ScriptError',...
[ME.message '\n\nError in ==> ' mfile ' at ' num2str(k) '\n\t' M{k}]);
end
end
end
结果:
>> runEachLine('foo.m', {4})
Performing Action: a = args{1};
Performing Action: b = 2;
Performing Action: c = a + b;
>>
你可能误解了我,没有阅读我所有的请求=]我明确地说“优雅是指在每一行之后都不调用操作,而是类似于脚本开头给出的简单命令。”a、b、c的赋值只是一个例子。在实际应用中,我希望使用一个长而复杂的脚本,并添加一个命令,该命令将导致在脚本中的每个命令之后执行一个操作。我不确定在Matlab中是否可行,但我将对此进行研究。为什么你希望在每一行代码后都执行完全相同的操作?据我所知,没有更好的解决方案。@A.Visser:关于你上次的编辑:这个想法很好,但代码中有多个错误。@Daniel:我也这么想。我不是一个写文件的英雄,这是一个非常奇怪的想法,我甚至没有测试过它。如果你能指出错误,那就好了,或者我会根据OP的要求删除代码。你要么误解了我,没有阅读我所有的请求=]我特别说“优雅,我的意思是每行之后都不调用操作,而是像脚本开头给出的简单命令。”a,b,c的赋值只是一个例子。在实际应用中,我希望使用一个长而复杂的脚本,并添加一个命令,该命令将导致在脚本中的每个命令之后执行一个操作。我不确定在Matlab中是否可行,但我将对此进行研究。为什么你希望在每一行代码后都执行完全相同的操作?据我所知,没有更好的解决方案。@A.Visser:关于你上次的编辑:这个想法很好,但代码中有多个错误。@Daniel:我也这么想。我不是一个写文件的英雄,这是一个非常奇怪的想法,我甚至没有测试过它。如果你能指出错误,那就好了,或者我就删除这段代码,这取决于OP想要什么。Q1-你想这是自动的吗?问题2-每行应该说什么?你想让它显示动作是什么吗?你的代码是一个脚本还是一个matlab函数?Q1-最好在最前面添加一个特定的命令。问题2——它应该按照我说的去做。disp()就是一个例子。Q3-函数。是的,请删除分号。Q1-是否希望自动执行此操作?问题2-每行应该说什么?你想让它显示动作是什么吗?你的代码是脚本还是matlab函数