matlab更新时间向量

时间:2012-01-18 20:58:56

标签: matlab time vector

我有19个细胞(19x1),其中一年有温度数据,其中前18个细胞代表20天(每个),最后一个细胞代表5天,因此(18 * 20)+5 = 365天。

在每个细胞中,应该有7200次测量(除了细胞19),每4分钟进行一次测量,因此每天进行360次测量(360 * 20 = 7200)。

测量的时间向量仅表示为天数,即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 x 2,360 x 3 ......等等;因此,最终数组应该有7200个值 从1到20的顺序。

如果可以,在添加了这些值的行中,第二列和第三列应该是 变成了南。

我意识到这是一个不寻常的问题,而且很难理解所要求的内容,但我希望我已经明确表达了我正在尝试的内容。 acheive。任何建议将不胜感激。

2 个答案:

答案 0 :(得分: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作为日期编号,而是根据单元格的距离来计算它你是阵。你会做(未经测试)的事情:

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

答案 1 :(得分: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];