提取阈值之间的数据

5次浏览(最近30天)
流行布洛卡
流行布洛卡 2021年4月9日
评论道: 流行布洛卡2021年4月9日
大家好!
我的数据分析遇到了一个问题,希望能找到一些解决方法。我已经查看了其他线程,看看是否有人有同样的问题并解决了它,但没有人打算做我想做的。
简而言之,我有这些csv(或txt)格式的数据,可以在这里用图形表示:
我想把这些数据编入4个不同的数组,每个数组代表一个周期。
(行)=找到(文件名= = 0)
我可以识别0在哪里,然后手动索引数据,但由于我有很多文件,我想自动化它。我可以设置阈值,但我有两个标准:
停止阈值:
  • 单元格1 > cell2中包含的值
  • 单元格2 = 0
对于起始阈值:
  • 单元格1 <单元格2中包含的值
  • 单元格1 = 0
正如你所看到的,阈值不能是一个固定的值,而且我要识别不止一个时期,因此我有困难。我远不是一个Matlab专家,所以也许我错过了一些简单的东西,在这种情况下,我将很高兴感谢您的帮助。
提前谢谢你!
2的评论
流行布洛卡
流行布洛卡 2021年4月9日
这是使用的数据

登录评论。

接受的答案

KSSV
KSSV 2021年4月9日
编辑:KSSV 2021年4月9日
一个=负载(“用法”) ;
A = A';
2 = 0(大小(A));
jj = A > 0;
strfind([0,jj(:)'],[0 1])) = 1;
idx = cumsum (ii)。* jj;
out = accumarray(idx(jj)',A(jj)',[],@(x){x'});
celldisp(出)
你得到了所有的四个数组。
1评论
流行布洛卡
流行布洛卡 2021年4月9日
谢谢,这绝对是我需要的,而且绝对不是我之前找到的,所以我很高兴我问了。

登录评论。

答案(1)

朱利叶斯Muschaweck
朱利叶斯Muschaweck 2021年4月9日
我相信逻辑索引和 diff 功能是你所需要的。
%创建并绘制类似您的数据的东西
x = 0:300;某x值
Y = - cos(x * 8 * PI / 300);%大约4个完整的余弦循环,负号使它从-1开始
Y (Y <0) = 0;%使用逻辑索引将负数设置为零
图();%看起来有点像您的数据
情节(x, y);
轴([-Inf Inf -0.1 Inf]);%确保y=0行是可见的
%手动检查y显示你想要的指数范围20:57,95:132等
dy = diff (y);相邻元素之间的差——条件的第一部分
扩展dy以在相同大小的数组上启用逻辑操作
dystart = (dy, 0);% dystart(i)是y(i+1) - y(i) -你的开始条件
dystop = [0, dy];% dystop(i)是y(i) - y(i-1) -你的开始条件
Justbeforestart = (y == 0) & (dystart > 0);%您的开始条件
Justafterstop = (y == 0) & (dystop < 0);停止条件%
%都只是…数组的长度与x相同,大多为0,只有在检测到条件时为1
提取开始和停止索引
idx = 1:长度(x);索引数组
%再次使用逻辑索引提取开始/停止索引
Startidx = idx(justbeforestart) + 1;%添加1从“justbeforestart”得到实际的“start”
Stopidx = idx(justafterstop) - 1;%减去1得到“停止”
%健康检查
如果Y (1) ~= 0 ||
错误(' data must begin and end of 0 ');
结束
如果长度(startidx) ~ = (stopidx)
错误('必须有相同的启动和停止次数');
结束
%提取四个数据范围并将它们放入单元格数组中
my_arrays = {};
i = 1:长度(startidx)
%为每个数据范围创建一个包含字段x和y的结构体
s.s x = x(startidx(i): stopidx(i)));
S.y = y(startidx(i): stopidx(i)));
my_arrays{我}= s;
结束
%绘制四个独立的范围
%注意零值丢失了,就像它们应该的那样。
图();
持有
i = 1:长度(my_arrays)
t = my_arrays {};
情节(t。x, t.y);
结束
轴([x(1) x(end) -0.1 1.1]);
1评论
流行布洛卡
流行布洛卡 2021年4月9日
与之前的答案非常不同,我会深入研究,谢谢

登录评论。

标签

下载188bet金宝搏


释放

R2020b

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!