Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于数组大小限制误差的Matlab问题_Matlab_Signals_Regression - Fatal编程技术网

关于数组大小限制误差的Matlab问题

关于数组大小限制误差的Matlab问题,matlab,signals,regression,Matlab,Signals,Regression,我有一个信号,请看下图。简而言之,我想对该信号上高于0.08和低于-0.08的值取平均值,分别对高于0.08和低于-0.08的值应用回归技术。我正在使用regstats命令,它在简单信号上工作得最好,但在计算信号时我遇到了麻烦。请看下面所附的图片来看看 有人能指导我如何避免这个问题吗 我的数据集在x轴和y轴上分别包含1*2030678和1*2030678 在x轴上有时间,在y轴上有差分信号 我还尝试改变工作空间的偏好,以增加阵列的大小,但在Matlab2015a中其最大值高达100000 也有一

我有一个信号,请看下图。简而言之,我想对该信号上高于0.08和低于-0.08的值取平均值,分别对高于0.08和低于-0.08的值应用回归技术。我正在使用regstats命令,它在简单信号上工作得最好,但在计算信号时我遇到了麻烦。请看下面所附的图片来看看

有人能指导我如何避免这个问题吗

我的数据集在x轴和y轴上分别包含1*2030678和1*2030678

在x轴上有时间,在y轴上有差分信号

我还尝试改变工作空间的偏好,以增加阵列的大小,但在Matlab2015a中其最大值高达100000

也有一个线性分析看看,它会与我的信号工作良好

提前谢谢

   clear all
   clc
   drv(1)=load('20170420.mat');
   t=drv(1).q_T0;
   ref=drv(1).Pos;
   lws=drv(1).Angle;

    sig_diff=ref-lws;
    plot(sig_diff)
   up=0.01;

   low=-up;
   stats_up = regstats(sig_diff(sig_diff>up), t(sig_diff>up), 'linear'); 

   %calculate linear regression for upper values
   up_intercept=stats_up.beta(1);
   up_slope=stats_up.beta(2);
   stats_low = regstats(sig_diff(sig_diff<low), t(sig_diff<low), 'linear'); 
   %calculate linear regression for lower values
   low_intercept=stats_low.beta(1);
   low_slope=stats_low.beta(2);

   %plot subplot 2 in figure 2 with lin regression lines
   plot(t, sig_diff, t,t*up_slope+up_intercept,t,t*low_slope+low_intercept);      
   grid
   legend('diff','reg up','reg low')

   hysteresis = abs(up_intercept)+abs(low_intercept)

中似乎有一个bug

将最大数组大小调整为100000是指在脚本中保存时,在将数组保存到.mat文件之前,它可以有多大。根据首选项面板中使用的名称,这一点都不直观,但您可以在此处查看其参考:

遗憾的是,您可能需要获得更多的RAM或更新到更新版本的MATLAB

编辑:

还有其他一些常见的技巧需要改进

将精度从双精度降低到单精度

t=single(drv(1).q_T0);
ref=single(drv(1).Pos);
lws=single(drv(1).Angle);
将数据分成可能重叠的部分,然后将其重新缝合在一起

第1部分的要点是,regstats可能会创建自己的双数组,但如果可以的话,这是将限制从22.0GB降低到~11.0GB的好方法。您正在失去精度,但这可能不足以让您担心,因为您正在回归


第2部分的要点是,您可能需要整个信号才能使回归正确工作,或者可能没有一种好的方法将结果缝合在一起,即,您如何做到这一点,并且仍然能够理解预期的结果

stats_up=regstats sig_diff sig_diff>up,tsig_diff>up,‘线性’,{'beta'}

我们可以使用beta强制regstats命令进行与线性回归相关的特定计算


它工作正常,可以节省矩阵阵列大小。

您的RAM是否超过22 GB?感谢excaza的回复是的,我可以管理,但我有很多统计数据,需要大量的RAM容量,因此是否有任何方法可以将我的数据分为一些矩阵并继续处理这些数据,但我还有6个驱动器的数据类似于我在上面的代码中提到了什么,所以我总共需要22Gb*6,这太多了,所以我们可以有一个技巧来解决这个问题。非常感谢您的回复信息,但是有没有其他方法可以通过将数据存储在某个矩阵或任何其他技巧来解决这个问题,因为随着统计数据的增加,每次都需要一个RAM数据是不可能的。我知道,另一种方法是获取下一个版本的MATLAB:。然后你调整它的工作方式,允许使用虚拟内存。感谢很多信息,它也工作得很好,我也找到了一个解决方案,我也在为其他人分享我的答案。非常感谢你的帮助和时间。谢谢你把它传给我。