2012-01-18 33 views
3

我有19个单元格(19x1)的温度数据为整年,前18个单元格代表20天(每个),最后一个单元格代表5天,因此(18 * 20)+5 = 365天。matlab更新时间向量

在每个小区中应该有7200次测量(除了细胞19),其中每个测量时每4分钟从而每天(360 * 20 = 7200)360次测量。

测量的时间向量仅表示为日数,即1,2,3 ...等等(因此无十进制日),因此显示为360 x 1 ...,依此类推。

由于传感器中的一些天失败,一些细胞含有少于7200个测量,其中一个在 特别是仅包含858行,其看起来类似于下面的例子:

a=rand(858,3); 
a(1:281,1)=1; 
a(281:327,1)=2; 
a(327:328,1)=5; 
a(329:330,1)=9; 
a(331:498,1)=19; 
a(499:858,1)=20; 

其中第1列=日,第2列和第3列是数据。

通过知道每天数应重复360次是有为了弥补360例如包括从1:20额外 量的每一个值的方法中,第一列需要 79 X 1的,46×2的,360×3的......等等;其中最终阵列因此应该具有的7200个值,从1到20的顺序。

如果这是可能的,则在添加了这些值的行中,第二列和第三列应该更改为nan。

我意识到这是一个不寻常的问题,而且很难理解问题,但是我希望我已经清楚表达了我想要达到的目标。任何意见将不胜感激。

+0

我从一台计算机没有Matlab的写作,所以我不能发布任何包含代码的答案,但我建议你尝试创建索引的矢量你有'[find(a(:,1)== 1); find(a(:,1)== 2); ...; find(a(:1)== 20)]'和一个你需要的索引向量,'[1 * ones(360,1) ; 2 * ones(360,1); ...]',然后使用您拥有的值和您需要的值进行插值。 – 2012-01-18 22:17:34

+0

如果a(281:327,1)= 1,那么该怎么办?'所以温度在两天内重复,但小于360,所以你不知道在哪一天? – cyborg 2012-01-18 23:30:27

+0

@cyborg:如果a(281:327,1)= 1,那么a(1:327,1)= 1,所以只需要另外的33个。 – Emma 2012-01-19 08:59:43

回答

1

下面是做到这一点的细胞基质的给定元素的一种方法:

full=zeros(7200,3)+NaN; 

for i = 1:20    % for each day 
    starti = (i-1)*360; % find corresponding 360 indices into full array 
    full(starti + (1:360), 1) = i; % assign the day 
    idx = find(a(:,1)==i);   % find any matching data in a for that day 
    full(starti + (1:length(idx)), 2:3) = a(idx,2:3); % copy matching data over 
end 

你很可能arrayfun,使这个雨衣,也许(??)更快。

您可以将其设置为一个函数,并使用cellfun将其应用于您的单元格。

PS - 如果你在Matlab help forums你会最肯定问你的问题比这一个雨衣&更有效的答案。可能涉及bsxfunarrayfunaccumarray或类似的东西。

更新 - 为单元阵列中的每个元素做到这一点,唯一的变化是不是因为你计算它的日数搜索i,基于多远allong单元阵列你。你会做这样的事情(未经测试):

for k = 1:length(cellarray) 
    for i = 1:length(cellarray{k}) 
     starti = (i-1)*360;    % ... as before 
     day = (k-1)*20 + i;    % first cell is days 1-20, second is 21-40,... 
     full(starti + (1:360),1) = day; % <-- replace i with day 
     idx = find(a(:,1)==day);   % <-- replace i with day 
     full(starti + (1:length(idx)), 2:3) = a(idx,2:3); % same as before 
    end 
end 
+0

这工作很好,非常感谢。 – Emma 2012-01-19 09:08:23

+0

我该如何改变这个工作时间,即从第121天到第140天?因为每个单元格的开始和结束日期都会发生变化。 – Emma 2012-01-19 09:38:25

+0

好点,我会更新我的答案 - 基本上,而不是用'我'来确定你计算的那一天,这取决于你在单元格中的位置。 – 2012-01-19 23:47:25

0

我不确定我是否正确理解你想要做的事情,但是下面的这个问题计算出你每天缺少多少测量值,并在'a'矩阵的底部添加额外的行,以便获得完整的7200x3矩阵。

nbMissing = 7200-size(a,1); 
a1 = nan(nbmissing,3) 

l=0 
for i = 1:20 
    nbMissing_i = 360-sum(a(:,1)=i); 
    a1(l+1:l+nbMissing_i,1)=i; 
    l = l+nb_Missing_i; 
end 

a_filled = [a;a1];