2017-07-24 109 views
0

我有6个不同的传感器数据集,我想找出均方根误差,但限制信号的限制意味着sig_diff_lim的RMSE。有关在MATLAB中找到均方根误差的循环问题

我试图申请循环,但它不工作可以有人告诉我,我在哪里有错。

感谢您的期待。

clc 

drv(1)=load('a.mat'); 
drv(2)=load('b.mat'); 
drv(3)=load('c.mat'); 
drv(4)=load('d.mat'); 
drv(5)=load('e.mat'); 
drv(6)=load('h.mat'); 

for i= 1:numel(drv) 
    t=drv(i).T; 
    ref=drv(i).P; 
    lws=drv(i).SWA; 

    sig_diff(i,:) =lws(i)-ref(i); 

    swvel_thres=10; 
    vehvel=30; 
    SAmax=90; 


    sig_diff_lim(i,:)=sig_diff((lws(i)<SAmax)&(lws(i)>-SAmax)&(swav(i)<swvel_thres)&(vel(i)>vehvel)); 



    square_error(i,:) = (sig_diff_lim(i)).^2; 
    mse(i,:)= mean(square_error(i)); 
    rmse(i,:) = sqrt(mse(i)); 

end 
rmse 
mse 

enter image description here

+0

究竟是什么错误? 'square_error'应为多大?它是6 * n矩阵还是6 * 1?什么输出是意外的? – Ash

+0

非常感谢您的回复。请看上面的附图,实际上是我面对的维度问题,所以我很困惑我是否正确应用了矩阵维度的循环内的命令。 – Peter

+0

并且Square错误应该是6 * 1,以便它为数据集1,2,3,4,5,6的每个数据集均值找到平​​方误差,然后在命令窗口中单独显示它们。 – Peter

回答

1

在我看来,虽然分配给sig_diff_lim(i,:)需要大小1*n的行向量,由

vec=sig_diff((lws_7(i)<SAmax)&(lws_7(i)>-SAmax)&(swav(i)<swvel_thres)&(vel(i)>vehvel)) 

返回的矩阵是不同的尺寸。

编辑

  • 首先,你确定sig_diff((lws(i)...不应该sig_diff(i,:)((lws(i)....在assignemnt行?
  • 现在,尝试逐元素乘法sig_diff之间(或sig_diff(i,:)),这取决于你回答我刚才的点)与你的逻辑索引,这样的(运营商。*):

    sig_diff.*((lws(i)<... %%%% instead of sig_diff((lws(i)<... 
    %%% or 
    sig_diff(i,:).*(lws(i)<... 
    

我认为应该这样做。

  • 不管这是否没有工作,尝试这个例子就明白了是怎么回事,有那种逻辑索引:

    >> t=[1 2 3 5 7;1 5 6 8 10]; 
    >> t(1,:)(l<7 & l>-7) 
    ans = 
    
    1 2 3 5 
    
    >> t(1,:)(l<7 & l>-2) 
    ans = 
    
    1 2 5 
    

当然,在这个例子中,t是在阈值发生变化时固定,而在您的代码中,矩阵本身正在改变。但它表明你的索引将返回可变长度的矩阵。

但是,随着解决我上面提出的,

>> t(1,:).*(l<7 & l>-2) 
>> t(1,:).*(l<7 & l>-7) 

都是大小5*1的。

+0

signal_diff_lim(i,:)= sig_diff((lws -SAmax)&(swav vehvel));实际上,每当加载新驱动器数据时,我都希望将数据保存在某个矩阵中。我会说实话与你不幸上面提到的解决方案没有奏效没有任何方式sig_diff_lim计算每个数据手段为数据1,2,3,4,5,6,因为我得到尺寸不匹配。 – Peter

+0

对不起,因为我正在尝试一些东西,但仍未成功。 – Peter

+0

@彼得对不起,没有把握这句话“没有任何sig_diff_lim计算出来的方式......”。你打印了sig_diff的大小吗?你何时/何地/你是如何初始化它的? – Ash