我有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。任何建议将不胜感激。
答案 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问你的问题,那么肯定会得到一个更光滑的&比这更有效的答案。可能涉及bsxfun
或arrayfun
或accumarray
或类似的事情。
更新 - 要对单元格数组中的每个元素执行此操作,唯一的变化是不是搜索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];