matlab中的逻辑索引

时间:2012-09-18 06:49:19

标签: matlab

考虑以下示例:

time = [733774,733774,733775,733775,733775,733776,733776];
depth = [0,10,0,5,10,0,10];
d = [1,1.3,1,2.5,2.5,1,1.2];
data = horzcat(time',depth',d');

dz = 1;

这里我分三天进行了多项测量。第一天在2个不同的深度进行2次测量,第二天在3个深度进行3次测量,第3次在2个深度进行2次测量。

我想生成一个新变量'newData',它对数据中的值进行线性插值(interp1)。但是,如果任何给定日期的测量数量超过2,我只想这样做。因此,对于上面的示例,这仅适用于733775.这里我想进行深度测量并增加垂直分辨率,例如< / p>

newDepth = min(depth):dz:max(depth);

但是,只有在测量次数超过2的情况下执行此操作。因此,我所描述的结果应为:

733774  0
733774  10
733775  0
733775  1
733775  2
733775  3
733775  4
733775  5
733775  6
733775  7
733775  8
733775  9
733775  10
733776  0
733776  10

加上'data(:,3)'的插值。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

这是一种方法(这次解决OP的编辑版本):

[idx,~,uniqueTimes] = grp2idx(time);

counts = hist(time,uniqueTimes);


%# expand data with counts greater than minCount
minCount = 2;
dz = 1;

expandedData = mat2cell(data,counts,3)

for ii = find(counts>minCount)'
    minZ = expandedData{ii}(1,2);
    maxZ = expandedData{ii}(end,2);

    intData(:,2) = (minZ:dz:maxZ)';
    intData(:,1) = expandedData{ii}(1,1);
    intData(:,3) = interp1(expandedData{ii}(:,2),expandedData{ii}(:,3),intData(:,2));

    expandedData{ii} = intData;

end

out = cat(1,expandedData{:})