У меня есть 6 разных наборов данных с датчика, и я хочу узнать среднеквадратическую ошибку, но ограниченный сигнал с ограничениями означает RMSE sig_diff_lim.

Я пытался применить цикл, но он не работает, может кто-нибудь сказать мне, в чем я виноват.

Спасибо в ожидании.

 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
Peter 24 Июл 2017 в 21:18
В чем именно заключается ошибка? Какого размера должен быть square_error? Это матрица 6 * n или 6 * 1? Какой результат неожиданный?
 – 
Ash
24 Июл 2017 в 22:30
Большое спасибо за твой ответ. Пожалуйста, взгляните на прикрепленное изображение выше, на самом деле проблема с размером, с которой я столкнулся, поэтому я не понимаю, правильно ли я применил команду в цикле для размеров матрицы.
 – 
Peter
24 Июл 2017 в 23:16
И квадратная ошибка должна быть 6 * 1, чтобы она находила квадратную ошибку для каждого средства набора данных для набора данных 1, 2, 3, 4, 5, 6, а затем отображала их отдельно в командном окне.
 – 
Peter
24 Июл 2017 в 23:23
Спасибо за обновления. Что такое lws_7? где были определены sig_diff_lim и sig_diff_lim? Можете ли вы дать определение / размеры всех задействованных вариаций? Простой подход к отладке, который будет заключаться в том, чтобы распечатать их размеры по отдельности, это даст вам представление о том, что пошло не так.
 – 
Ash
24 Июл 2017 в 23:24
Спасибо за ответ. Очень жаль, что это на самом деле lws, я, к сожалению, поместил в код при загрузке, но я обновил свой код. Sig_diff_lim на самом деле является разницей сигнала с такими ограничениями, как swvel, vehvel, SAmax.
 – 
Peter
24 Июл 2017 в 23:32

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).... в строке назначения?
  • Теперь попробуйте поэлементное умножение (оператор. *) Между 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.

1
Ash 25 Июл 2017 в 02:10
Signal_diff_lim (i,:) = sig_diff ((lws -SAmax) & (swav vehvel)); На самом деле я хочу сохранять данные в какой-то матрице каждый раз, когда загружаются новые данные с диска. Я буду говорить правду с вами, к сожалению, вышеупомянутое решение не сработало, нет никакого способа, чтобы sig_diff_lim вычислялся для каждого средства данных для данных 1, 2, 3, 4,5, 6, потому что я получаю несоответствие размеров.
 – 
Peter
25 Июл 2017 в 00:17
Извините за поздний ответ, так как я пробовал некоторые вещи, но безуспешно.
 – 
Peter
25 Июл 2017 в 00:18
Извините, я не уловил эту фразу "не может быть вычислено sig_diff_lim ....". Вы распечатали размер sig_diff? когда / где / как вы его инициализировали?
 – 
Ash
25 Июл 2017 в 00:26
Я делаю это просто, я не получаю значения для всех 6 дисков в vec после того, как evrytime i обновлен означает для i = 1 мне нужно vec для обновления, а для i = 2 мне нужно vec для обновления снова, но с помощью вышеупомянутой команды это не сохраняет значения каждый раз, когда i изменяется, означает 1,2,3 и т. д.
 – 
Peter
25 Июл 2017 в 01:15
Я делаю это просто. У меня есть опорный сигнал и данные с датчика для 6 разных приводов. Я хочу рассчитать RMSE для данных разности сигналов, но с некоторыми ограничениями. Sig_diff_lim - это фактически разница сигналов с ограничениями. Я попытался применить цикл, который должен сохранять данные в матрице для всех данных, таких как 1,2,3,4,5,6, означает для каждого изменения значений I, которые я хочу вычислить RMSE. Приносим извинения за неудобства. Надеюсь, я смог объяснить вам точную ситуацию.
 – 
Peter
25 Июл 2017 в 01:15