在matlab中创建方波以覆盖数据集
Creating a square wave to overlay data set in matlab
在 Matlab 中,我试图实现以下目标:
我有一个数据集,该数据集在生物学上代表了给予刺激时大脑中的激活。所以数据是这样的,我们有 9 个刺激数据点,然后是 15 个休息数据点,它一直这样持续大约 300 个数据点(实时 4 分钟)。
我可以很容易地绘制数据,但我试图叠加一个方波,它代表 "stimuluation" 的时间,这样只要看一下图表就很容易看出哪个是休息时间和刺激。
很简单,我创建了一个向量 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.5s。前3点
-3、-1.5、0 是休息时间。然后从 0 秒开始,刺激开始大约 9 秒(这将在 9 秒的时间内产生 6 个数据点)。
所以我的问题是 - 是否可以使用某种 for 循环来创建此向量 X 来说明从 0 X = 1 开始的 6 个数据点和接下来的 10 个 X = 0?我在想以下几点:
X = zeros(1,304) %to create a 1x304 vector of zeros
X(0:3)=0
X(3:9)=1
X(9:19)=0
但话又说回来..这是手写的。
有人可以帮忙吗?
谢谢!
模运算很容易:
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
。
正如您已经告诉我们的那样:您所拥有的是一个重复的模式。
在你的例子中,模式是向量
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);
在 Matlab 中,我试图实现以下目标:
我有一个数据集,该数据集在生物学上代表了给予刺激时大脑中的激活。所以数据是这样的,我们有 9 个刺激数据点,然后是 15 个休息数据点,它一直这样持续大约 300 个数据点(实时 4 分钟)。
我可以很容易地绘制数据,但我试图叠加一个方波,它代表 "stimuluation" 的时间,这样只要看一下图表就很容易看出哪个是休息时间和刺激。
很简单,我创建了一个向量 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.5s。前3点 -3、-1.5、0 是休息时间。然后从 0 秒开始,刺激开始大约 9 秒(这将在 9 秒的时间内产生 6 个数据点)。
所以我的问题是 - 是否可以使用某种 for 循环来创建此向量 X 来说明从 0 X = 1 开始的 6 个数据点和接下来的 10 个 X = 0?我在想以下几点:
X = zeros(1,304) %to create a 1x304 vector of zeros
X(0:3)=0
X(3:9)=1
X(9:19)=0
但话又说回来..这是手写的。
有人可以帮忙吗?
谢谢!
模运算很容易:
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
。
正如您已经告诉我们的那样:您所拥有的是一个重复的模式。 在你的例子中,模式是向量
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);