在Matlab中我试图实现以下目标:
我有一个数据集,在生物学上表示给予刺激时大脑中的激活。所以数据是这样的,我们有9个数据点的刺激,然后是15个休息,并且它继续像大约300个数据点那样(实时4分钟)。
我能够轻松地绘制数据,但我试图覆盖一个方波,它表示存在“刺激”的时间,这样只需通过查看图表就可以很容易地看出哪个是休息期和哪个刺激。
很简单,我已经创建了一个向量X并使其成为(前3个点意味着为0)
X = [0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0]
将其绘制在与数据相同的图表上。它工作正常,但问题是我需要根据我的时间尺度自动创建X.
Total_time = [-3:1.5:302]
这是我的总时间刻度,从-3到302秒,采样率为1.5秒。前3分 -3,-1.5,0是休息时间。然后从0秒开始,刺激开始约9秒(这将在9秒时间内产生6个数据点)。
所以我的问题是 - 是否有可能使用某种for循环来创建这个向量X来表示从0 X = 1和下一个10 X = 0的6个数据点?我在考虑以下几点:
X = zeros(1,304) %to create a 1x304 vector of zeros
X(0:3)=0
X(3:9)=1
X(9:19)=0
但话又说回来......这是手写的。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
使用模运算很容易:
m = 3; %// initial low period
n = 6; %// high period
p = 10; %// low period
s = 304; %// x size
x = [zeros(1,m) mod(0:s-m-1, n+p)<n];
结果(第一个值):
0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 ...
请注意,如果需要,n
和p
可以是非整数。例如,如果高周期持续5秒且采样周期为1.5秒,则只需定义n=5/1.5
,即可给出
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ...
可以看出,高周期持续4或3个样本以容纳非整数n
。
答案 1 :(得分:1)
正如你已经告诉过我们的:你所拥有的是一种重复模式。 在您的情况下,模式是向量
pattern = [zeros(1,3) ones(1,9) zeros(1,15-3)];
因此,您可以使用repmat
复制此向量来生成信号:
startTime = -3;
endTime = 302;
timeStep = 1.5;
%%// Computation
time = startTime:timeStep:endTime;
numPatterns = ceil(length(time)/length(pattern));
X = repmat(pattern, 1, numPatterns);
%// As the pattern will end after endTime, we remove everything beyond endTime
X(length(time)+1:end) = [];
%%// Plot
plot(time, X);