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('

有没有一种优雅的方法可以让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('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函数