MatLab:更新两个独立的动画人物,可视化重量和错误

时间:2017-11-11 06:04:42

标签: matlab animation plot matlab-figure

我正在尝试想象我必须做的小模拟。对于这项任务,没有必要,但经常会发生这种情况:我遇到问题并希望在继续之前找到解决方案。

模拟是来自计算神经科学部门的一个超简单的神经网络,具有一个“Oja”。算法。我将值绘制为散点图,并希望在循环上设置变化的权重。对于它本身工作正常(图2或f2句柄) 然后我决定打印从一次运行到另一次运行的权重向量的差异作为标准计算。我希望将其绘制为随时间演变的线(图1又称f1)。但是,虽然我总是激活图2,但它会切换回图1并在那里绘制。

当然,我搜索了互联网以及stackexchange,在那里我发现了很多关于动画的迷人内容。没有解决问题的任何事情......

两个问题:

  1. 为什么?
  2. 我需要更改哪些才能使其正常工作?
  3. 感谢。

    以下是代码:

    function [t, w, dw]=weight(X)
    
    w=rand(2,1)*5; %Initialization
    
    %constants
    n=1; 
    alpha=1;
    dt=0.01;
    T=5;
    L=length(X);
    w_old=[0; 0];
    s=size(w_old)
    t=0;
    limit=0.001;
    
    
    %handles for the figures Error and weight animation
    f1= figure
    set(f1,'DoubleBuffer','on', 'Name','Error');
    ax1 = axes('Position',[0.1 0.1 0.7 0.7]);
    
    f2=figure
    set(f2, 'Name', 'weights');
    
    %normalizing and plot
    X=[X(:,1)-mean(X(:,1)),X(:,2)-mean(X(:,2))];
    scatter(X(:,1),X(:,2));
    
    %function handle for the error and the weights animation
    herror = animatedline('Marker','.');
    
    hLine = line('XData',w(1), 'YData',w(2), 'Color','r', ...
        'Marker','o', 'MarkerSize',6, 'LineWidth',2);
    hTxt = text(w(1), w(2), sprintf('(%.3f,%.3f)',w(1),w(2)), ...
        'Color',[0.2 0.2 0.2], 'FontSize',8, ...
        'HorizontalAlignment','left', 'VerticalAlignment','top');
    
    while (t<T)
        for i=1:L
            w_old= w;
            u=X(i,:);
            v=u*w;
            w=w+dt*n*(v*u'-alpha*v^2*w);   %Oja rule
            figure(f2);
            hold on;
            set(hLine, 'XData',w(1), 'YData',w(2))   
            set(hTxt, 'Position',[w(1) w(2)], ...
            'String',sprintf('(%.3f,%.3f,%.2f)',[w(1) w(2) t]))        
            drawnow %# force refresh
            %#pause(DELAY)  
            hold off;
            dw=norm(w_old-w);
            figure(f1)
            hold on;
            addpoints(herror, (i*t/dt),dw)
            drawnow
            hold off;
            if dw<limit,  break; end
        end
        t=t+dt;
    
        if ~ishandle(hLine), break; end  
    end
    end
    

1 个答案:

答案 0 :(得分:2)

您创建了一个与隐藏动画的绘图重叠的新轴ax1。 您还要在herror = animatedline('Marker','.');之后将f2=figure放在for循环之前的第一个数字中。这是工作代码:

function [t, w, dw]=weight(X)
X = randn(20,2);
w=rand(2,1)*5; %Initialization

close all

%constants
n=1;
alpha=1;
dt=0.01;
T=5;
L=length(X);
w_old=[0; 0];
s=size(w_old);
t=0;
limit=0.001;


%handles for the figures Error and weight animation
f1= figure(1);
hold on;
set(f1,'DoubleBuffer','on', 'Name','Error');
%ax1 = axes('Position',[0.1 0.1 0.7 0.7]);
%function handle for the error and the weights animation
herror = animatedline('Marker','.');
xlabel('t'); ylabel('Error');

f2=figure(2);
hold on;
set(f2, 'Name', 'weights');
xlabel('W1'); ylabel('W2')

%normalizing and plot
X=[X(:,1)-mean(X(:,1)),X(:,2)-mean(X(:,2))];
scatter(X(:,1),X(:,2));

hLine = line('XData',w(1), 'YData',w(2), 'Color','r', ...
    'Marker','o', 'MarkerSize',6, 'LineWidth',2);
hTxt = text(w(1), w(2), sprintf('(%.3f,%.3f)',w(1),w(2)), ...
    'Color',[0.2 0.2 0.2], 'FontSize',8, ...
    'HorizontalAlignment','left', 'VerticalAlignment','top');

while (t<T)
    for i=1:L
        w_old= w;
        u=X(i,:);
        v=u*w;
        w=w+dt*n*(v*u'-alpha*v^2*w);   %Oja rule

        set(hLine, 'XData',w(1), 'YData',w(2))
        set(hTxt, 'Position',[w(1) w(2)], ...
            'String',sprintf('(%.3f,%.3f,%.2f)',[w(1) w(2) t]))
        drawnow %# force refresh

        dw=norm(w_old-w);
        figure(f1);
        addpoints(herror, (i*t/dt),dw)
        drawnow
        if dw<limit; break; end

    end
    t=t+dt;

    if ~ishandle(hLine), break; end
end
end

对我来说,使用一个窗口和2 subplots而不是来回切换窗口似乎更自然。