在Matlab中,从一个有间隙的数据集中创建多个无间隙矩阵(或结构)
我有一些时间序列中的空白数据。找到了缺口的指数以及长度和所有内容。问题是我想把我的数据(列:时间和测量值)分割成几个矩阵/向量,或者分割成一个结构。我的计划是对这些小时间序列进行傅里叶变换,以便进一步比较 让我们尝试在示例中解释: Tdat是时间序列,有3825个点在Matlab中,从一个有间隙的数据集中创建多个无间隙矩阵(或结构),matlab,matrix,vector,gaps-in-data,Matlab,Matrix,Vector,Gaps In Data,我有一些时间序列中的空白数据。找到了缺口的指数以及长度和所有内容。问题是我想把我的数据(列:时间和测量值)分割成几个矩阵/向量,或者分割成一个结构。我的计划是对这些小时间序列进行傅里叶变换,以便进一步比较 让我们尝试在示例中解释: Tdat是时间序列,有3825个点 % find number of gaps nogap = diff(Tdat(find(diff(Tdat)>0.051))); %20Hz measurement numgaps = length(
% find number of gaps
nogap = diff(Tdat(find(diff(Tdat)>0.051))); %20Hz measurement
numgaps = length(nogap) %number of gaps = bumgaps+1
此处的间隙数为8
%indexing the gaps
w = find(diff(Tdat)>0.51); %finding the gaps %0.051 since 1/20=0.05
u = find(diff(Tdat)<0.51); %finding indices with data
series = length(M)-length(u) %amount of data series without gaps
这些间隙之间的点数为425
因此,我希望有9个不同的矩阵/向量,每个长度425,只有数据,没有时间间隔
有没有什么办法,或者我搜索得不够好,没有找到答案?从您的示例中我可以看到,这些差距似乎不是您要删除的数据点,而是划分数据的地方?我说得对吗?由于生成的数据向量长度相同,您可能希望
重塑()?如重塑(Tdat,425,9)
下面是一个小例子:
>> a = [1:12]'
a =
1
2
3
4
5
6
7
8
9
10
11
12
>> b = reshape(a,4,3)
b =
1 5 9
2 6 10
3 7 11
4 8 12
如果要将数据作为单元格,也可以在以后使用mat2cell()
:
>> c = mat2cell(b,4,ones(1,3))
c =
[4x1 double] [4x1 double] [4x1 double]
>> c{2}
ans =
5
6
7
8
从您的示例中我可以看到,似乎差距不是要删除的数据点,而是划分数据的位置?我说得对吗?由于生成的数据向量长度相同,您可能希望重塑()?如重塑(Tdat,425,9)
下面是一个小例子:
>> a = [1:12]'
a =
1
2
3
4
5
6
7
8
9
10
11
12
>> b = reshape(a,4,3)
b =
1 5 9
2 6 10
3 7 11
4 8 12
如果要将数据作为单元格,也可以在以后使用mat2cell()
:
>> c = mat2cell(b,4,ones(1,3))
c =
[4x1 double] [4x1 double] [4x1 double]
>> c{2}
ans =
5
6
7
8
我找到了另一个答案,结果证明它更有用。
以防有人感兴趣
由于并非所有部分(没有间隙)的长度都相等,因此很难跟踪用零填充某些列所需的所有索引
因为我知道所有的空白从哪里开始,所以我可以使用一个新的索引将它们放入结构中
gl = find(diff(Tdat)>0.051);
gaps = length(gl)-1;
for a = 1:gaps;
Meas(a).M = M( gl(a)+1 : gl(a+1) );
end
其中Tdat是我的时间向量,M是数据向量。我找到了另一个答案,最终证明它更有用。
以防有人感兴趣
由于并非所有部分(没有间隙)的长度都相等,因此很难跟踪用零填充某些列所需的所有索引
因为我知道所有的空白从哪里开始,所以我可以使用一个新的索引将它们放入结构中
gl = find(diff(Tdat)>0.051);
gaps = length(gl)-1;
for a = 1:gaps;
Meas(a).M = M( gl(a)+1 : gl(a+1) );
end
其中Tdat是我的时间向量,M是数据向量。你能提供小示例数据和相应的输出吗?Well Ii有一个3列的结构:时间-电压-电流。我把时间和电流放在向量中进行处理。所以我可能更愿意为时间和当前时间9创建新的向量。时间在1970年1月1日00:00:00之后仍以秒为单位。但这不重要。对于这一个,数据范围从10^(-9)到10^(-6)。时代更大;)你能提供小的示例数据和相应的输出吗?Well Ii有一个3列的结构:时间-电压-电流。我把时间和电流放在向量中进行处理。所以我可能更愿意为时间和当前时间9创建新的向量。时间在1970年1月1日00:00:00之后仍以秒为单位。但这不重要。对于这一个,数据范围从10^(-9)到10^(-6)。时代更大;)是的,这似乎是一个很好的解决方案。。然后我就可以知道要使用哪些列了。。我将直接尝试:)我有一个新问题,因为我的数据不总是可重塑的(错误的元素数量来适应此..)“使用重塑来重塑元素数量的错误不能更改。”我猜这是因为我的第一个或最后一个数据集比其他数据集小。。有没有办法解决这个问题S@IceQueeny一个简单的解决方案是用零填充,以获得长度相等的信号。您还可以尝试创建一个groupingVariable
(可能在差距指数上使用cumsum()
,如grpVar=cumsum(w)
)。然后使用Tdat(grpVar==1)、Tdat(grpVar==2),…
来区分不同的数据集。是的,这似乎是一个很好的解决方案。。然后我就可以知道要使用哪些列了。。我将直接尝试:)我有一个新问题,因为我的数据不总是可重塑的(错误的元素数量来适应此..)“使用重塑来重塑元素数量的错误不能更改。”我猜这是因为我的第一个或最后一个数据集比其他数据集小。。有没有办法解决这个问题S@IceQueeny一个简单的解决方案是用零填充,以获得长度相等的信号。您还可以尝试创建一个groupingVariable
(可能在差距指数上使用cumsum()
,如grpVar=cumsum(w)
)。然后使用Tdat(grpVar==1)、Tdat(grpVar==2),…
来区分不同的数据集。