我正在记录一个小电路上的电压变化-这记录了老鼠的喂养。当老鼠进食时,电路电压发生变化,我将其转换成1和0,一切正常。
BUT-我想计算馈电"爆发"的数量和持续时间-即在250 ms(75个样本)内发生的电路关闭实例。如果关闭之间的间隔大于250ms,我想把它算作一个新的'burst'
我想我寻求帮助问matlab来比较每一个1在数字文件的样本数量和样本数量的下一个1——如果不同的是75多,调用第一个1个轮和第二个月底开始新一轮的分类不同的差距,但如果不是,保持第一的样本数量1和比较它和下一个,下一个下一个,直到75 -样本差异
我可以将每个1与下一个1进行比较:
n=1; m=2;
for i = 1:length(bouts4)-1
if bouts4(i+1) - bouts4(i) >= 75 %250 msec gap at a sample rate of 300
boutend4(n) = bouts4(i);
boutstart4(m)= bouts4(i+1);
m = m+1;
n = n+1;
end
我真的不想为两个变量遍历I…
有什么想法?
- db
您可以尝试下面的代码
time_diff = diff(bouts4);
new_feeding = time_diff > 75;
boutend4 = bouts4(new_feeding);
boutstart4 = [0; bouts4(find(new_feeding) + 1)];
其实还不错。我们可以把它完全矢量化。首先,让我们从两个信号开始:
- 未触碰电压的版本
- 电压的一个版本,它在时间上移动了1步(即它在时间指数= 2时开始)。
基本算法是:
- 遍历每个元素,看看差异是否超过阈值(在您的例子中是75)。
- 在单独的数组中枚举每一个的位置
现在进入代码!
%// Make those signals
bout4a = bouts4(1:end-1);
bout4b = bouts4(2:end);
%// Ensure column vectors - you'll see why soon
bout4a = bout4a(:);
bout4b = bout4b(:);
% // Step #1
loc = find(bouts4b - bouts4a >= 75);
% // Step #2
boutend4 = [bouts4(loc); 0];
boutstart4 = [0; bouts4(loc + 1)];
除了:
感谢尾巴。你也可以用diff
。它就像我之前做的那样,通过复制这些向量来执行差运算。diff
的工作原理基本相同。但是,我决定不使用它,这样您就可以看到您编写的代码如何准确地以矢量化的方式转换过来。只有这样才能学习,对吧?
继续!
让我们慢慢来。前两行代码发出了我所说的那些信号。一个是原始的(直到length(bouts) - 1
),另一个是相同的长度,但移动了一个时间索引。接下来,我们使用find
来查找时间索引为>= 75
的时隙。之后,我们使用这些位置来访问bouts
数组。结束数组访问原始数组,而开始数组访问相同的位置,但移动了一个时间索引。
我们需要使这两个信号列向量的原因是我将信息附加到起始向量的方式。我不确定你的数据是行还是列,为了使它完全独立于方向,我要确保你的数据是列。这是因为如果我尝试添加一个0
,如果我将它添加到一个行向量上,我必须使用一个空格来表示我要到下一列。如果我对列向量这样做,我必须用分号去到下一行。为了完全避免检查它是行向量还是列向量,我要确保它无论如何都是列向量。
通过查看您的代码m=2
。这意味着当您开始写入这个数组时,第一个位置是0
。因此,我在这个数组的开头人为地放置了一个0
,然后在它后面加上其余的值。
希望这对你有帮助!