如何使我的MATLAB仿真代码更有效地运行?

问题描述 投票:0回答:1

我正在创建一个模拟模型,以模拟流过河流的机器人。我添加的代码越多,模拟的速度就越慢。有时,它运行太慢,以致按钮不起作用。有人知道我会如何加快速度吗?

可能是我的电脑。几次,模拟运行就完美无瑕。

代码:

function CleanRiverSolutionsSimulation
%Initialize Figure
f = figure('Visible','off','Position',[250,250,1000,500],'Name','Clean River Solutions Simulation');

%Initialize variables (when changing these, don't forget to change them in
%the stop button function)
robot_position = [0 0 0];
last_robot_position = [-1 0 0];
time_data = [0];
depth_data = robot_position(3);
simulation_mode = 'paused'; %options: 'paused' 'running' 'stopped'
river_depth = 10;
water_flow_rate = 1;

%Initializes Plots
main_plot = axes('Units','pixels','Position',[50,225,500,250]);
data_plot1 = axes('Units','pixels','Position',[625,350,200,100]);

%Initializes Sliders
water_flow_slider = uicontrol('style','slider','position',[50 175 200 20],'min',0,'max',2.5,'callback',@callback_waterflow,'value',water_flow_rate);
water_flow_text = uicontrol('Style','text','String','River Water Flow','Position',[30 140 200 30]);
water_flow_text.String = sprintf('River Water Flow: %f m/s',get(water_flow_slider,'value'));
river_depth_slider = uicontrol('style','slider','position',[50 125 200 20],'min',0,'max',10,'callback',@callback_riverdepth,'value',river_depth);
river_depth_text = uicontrol('Style','text','String','River Depth','Position',[30 90 200 30]);
river_depth_text.String = sprintf('River Depth: %f m',get(river_depth_slider,'value'));

%Initializes Push Buttons
run_button = uicontrol('Style','pushbutton','String','Run','Position',[300 175 50 20],'callback',@callback_runbutton);
pause_button = uicontrol('Style','pushbutton','String','Pause','Position',[360 175 50 20],'callback',@callback_pausebutton);
stop_button = uicontrol('Style','pushbutton','String','Stop','Position',[420 175 50 20],'callback',@callback_stopbutton);
status_text = uicontrol('Style','text','String','Status','Position',[300 140 150 30]);
status_text.String = sprintf('Status: %s','Paused');

%After setup, makes figure visible
f.Visible = 'on';

%Environment Settings
riv_length = 20;
riv_width = 20;

%River flow settings
flow_dots = 4;

%Initialize Main Plot (when changing these, don't forget to change them in
%the stop button function)
plot3(main_plot,robot_position(1),robot_position(2),robot_position(3),'Marker', 'o','Color','r')
main_plot.XLim = [-riv_length/2 riv_length/2];
main_plot.YLim = [-riv_width/2 riv_width/2];
main_plot.ZLim = [-1*river_depth 1];
main_plot.XGrid = 'on';
main_plot.YGrid = 'on';
main_plot.ZGrid = 'on';

%Initialize time sequence (when changing these, don't forget to change them in
%the stop button function)
time = clock;
pausedStartTime = time(6)+60*time(5)+3600*time(4);
startTime = pausedStartTime;
pausedTime = 0;
totalPausedTime = 0;

%MAIN SIMULATION LOOP
while ishandle(f)
    switch simulation_mode
        case 'running'

            %TODO-add forces and have the positions depend on the forces

            %creates a time t to use in simulated equations
            time = clock;
            t = ((time(6)+60*time(5)+3600*time(4))-startTime-totalPausedTime);

            %X
            last_robot_position(1) = robot_position(1);
            robot_position(1) = 0;
            %Y
            last_robot_position(2) = robot_position(2);
            robot_position(2) = 0;
            %Z
            last_robot_position(3) = robot_position(3);
            robot_position(3) = -4+2*sin(2*t); %just did a sin wave to show movement

            %UPDATE MAIN PLOT
            %update robot position
            plot3(main_plot,robot_position(1),robot_position(2),robot_position(3),'Marker','o','Color','r')
            %update robot velocity vector?
            forward_vector = [robot_position(1)-last_robot_position(1),...
                              robot_position(2)-last_robot_position(2),...
                              robot_position(3)-last_robot_position(3)];
            forward_unit_vector = forward_vector./norm(forward_vector);
            hold(main_plot,'on')
            plot3(main_plot,[robot_position(1) (robot_position(1)+forward_unit_vector(1))],...
                            [robot_position(2) (robot_position(2)+forward_unit_vector(2))],...
                            [robot_position(3) (robot_position(3)+forward_unit_vector(3))]);
            %update river flow dots
            for dot = 1:flow_dots
                plot3(main_plot,-riv_length/2+(dot-1)*(riv_length/flow_dots)+mod((t/water_flow_rate),(riv_length/flow_dots)),10,0,'Marker','o','Color','b')
            end
            %update plot settings
            main_plot.XLim = [-riv_length/2 riv_length/2];
            main_plot.YLim = [-riv_width/2 riv_width/2];
            main_plot.ZLim = [-1*river_depth 1];
            main_plot.XGrid = 'on';
            main_plot.YGrid = 'on';
            main_plot.ZGrid = 'on';
            hold(main_plot,'off')

            %Update Data Plot 1 (depth)
            time = clock;
            time_data = [time_data ((time(6)+60*time(5)+3600*time(4))-startTime-totalPausedTime)];
            depth_data = [depth_data robot_position(3)];
            plot(data_plot1,time_data,depth_data)
            title('Robot Depth')
            data_plot1.XLim = [max(0,(((time(6)+60*time(5)+3600*time(4))-startTime-totalPausedTime)-15)),...
                               max(0,(((time(6)+60*time(5)+3600*time(4))-startTime-totalPausedTime)-15)+20)];
            data_plot1.YLim = [-1*river_depth 1];

            pause(0.1); %anything lower and the simulation won't pause

        case 'paused'

            pause(0.01); %need this or the sim won't start

        case 'stopped'         
            %so far, this line is never run
    end

end

    %executes callback for water flow slider
    function callback_waterflow(source,eventdata)
        water_flow_text.String = sprintf('River Water Flow: %f m/s',get(water_flow_slider,'value'));
        water_flow_rate = get(water_flow_slider,'value');
    end

    %executes callback for river depth slider
    function callback_riverdepth(source,eventdata)
        river_depth_text.String = sprintf('River Depth: %f m',get(river_depth_slider,'value'));
        river_depth = get(river_depth_slider,'value');
    end

    %executes callback for run button
    function callback_runbutton(source,eventdata)
        switch simulation_mode
            case 'stopped'
                %Reinitialize time sequence
                time = clock;
                startTime = time(6)+60*time(5)+3600*time(4);
                pausedTime = 0;
                totalpausedTime = 0;
            case 'paused'
                time = clock;
                currentTime = time(6)+60*time(5)+3600*time(4);
                pausedTime = currentTime-pausedStartTime;
                totalPausedTime = totalPausedTime + pausedTime;
                pausedTime = 0;
        end

        simulation_mode = 'running';
        status_text.String = sprintf('Status: %s','Running');
    end

    %executes callback for run button
    function callback_pausebutton(source,eventdata)
        switch simulation_mode
            case 'running'
                status_text.String = sprintf('Status: %s','Paused');
                time = clock;
                pausedStartTime = time(6)+60*time(5)+3600*time(4);
        end
        simulation_mode = 'paused';
    end

    %executes callback for run button
    function callback_stopbutton(source,eventdata)
        simulation_mode = 'stopped';
        status_text.String = sprintf('Status: %s','Stopping');

        %Reset all simulation data
        robot_position = [0 0 0];
        time_data = [0];
        depth_data = robot_position(3);

        %Reinitialize time sequence
        time = clock;
        pausedStartTime = time(6)+60*time(5)+3600*time(4);
        startTime = pausedStartTime;
        pausedTime = 0;
        totalPausedTime = 0;

        %Reinitialize Plots
        plot3(main_plot,robot_position(1),robot_position(2),robot_position(3),'Marker','o','Color','r')
        main_plot.XLim = [-riv_length/2 riv_length/2];
        main_plot.YLim = [-riv_width/2 riv_width/2];
        main_plot.ZLim = [-river_depth 1];
        plot(data_plot1,time_data,depth_data)

        status_text.String = sprintf('Status: %s','Data is reset.');
        simulation_mode = 'paused';
    end

end
performance matlab simulation
1个回答
0
投票

matlab为您提供了执行此操作的工具-它称为探查器。试试这个

profiler on;
your_script_name;
profiler viewer;

从输出中,您可以确定哪些行或函数花费了您的大部分运行时间。每当需要加速Matlab代码时,我都会使用它。

© www.soinside.com 2019 - 2024. All rights reserved.