【问题标题】:logical indexing in matlabmatlab中的逻辑索引
【发布时间】:2012-09-18 15:33:51
【问题描述】:

考虑以下示例:

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 次测量,第三天在 2 个深度进行了 2 次测量。

我想生成一个新变量“newData”,它对数据中的值进行线性插值(interp1)。但是,我只想在任何给定日期的测量次数超过 2 时执行此操作。因此,对于上面的示例,这仅适用于 733775。在这里我想进行深度测量并增加垂直分辨率,例如

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)' 的插值。

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

【问题讨论】:

  • 输出中没有 733775 的深度 0。这是故意的吗?如果某一天的深度为[1 3 1] 怎么办?如果他们是[1 1 4] 怎么办?如果他们是[1 4 5] 怎么办?在这些情况下,插值应该如何?
  • 它应该是从最小深度到最大深度的插值,间隔为 1。此外,在我的示例中,深度不会是 [1 3 1]。更正了示例。谢谢

标签: matlab


【解决方案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{:})

【讨论】:

  • 谢谢,我现在提供了一个我想要实现的示例。这更具体到我的实际问题。
  • 澄清一下,在expandedData = mat2cell(data,counts,3); 3 是指唯一天数吗?还是列号?
  • @Kate: 不是,指的是data的列数,可以用size(data,2)代替。
  • 在将其应用于我自己的数据时,我似乎遇到了问题。我在 expandData = mat2cell(data,counts,size(data,2)) 行之后收到错误“错误的单元格引用操作”。
  • @Kate:我很难重现那个错误。您确定数据与您的问题中的格式相同,并且您没有意外定义,例如size 作为数组?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2016-08-28
  • 2014-11-05
  • 2023-03-10
  • 2020-02-06
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多