1

嗨,我在 Matlab (PDS(:,39)) 中有一列值。此列针对各种内容进行了过滤,并且有两个单独的标记列 (PDS(:,[41 81])),对于有效行为 0,对于无效行为 -1。我正在取有效数据的平均值,如果平均值高于 0,我想让这个值无效并再次取平均值,直到平均值低于某个值(在本例中为 0.2)。这是我的代码:

% identify the VALID values
U1 = (PDS(:,81)==0);
F1 = (PDS(:,41)==0);

% only calculate using the valid elements
shearave = mean(PDS(U1&F1,39));

while shearave > 0.2
    clear im
    % determine the largest shear value overall for filtered and
    % non-flagged
    [c im] = max(PDS(U1&F1,39));
    % make this value a NaN
    PDS(im,39)=NaN;
    % filter using a specific column and the overall column
    PDS(im,41)=-1;
    F1 = (PDS(:,41)==0);
    % calculate shear ave again using new flagging column - remove the ";" so I can see        the average change
    shearave = mean(PDS(U1&F1,39))
end

Matlab 给我的输出是:

剪切 =

0.3032

剪切 =

0.3032

剪切 =

0.3032

ETC

循环不会使用新的有效数据重新评估。我该如何解决这个问题?我必须休息还是继续?或者也许是不同类型的循环?谢谢你的帮助。

4

2 回答 2

2

您不需要使用循环,我会执行以下操作:

对数据进行排序:

m=PDS(U1&F1,39);
[x isort]=sort(m); 

然后计算排序向量的累积平均值:

y = cumsum(x)./[1:numel(x)]';

然后在 0.2 处截断,并使用找到的索引检索所需的值...

ind=find(y<=0.2);
values_needed=m(isort(ind));
于 2013-01-13T22:16:20.340 回答
0

您将第 39 列中的值迭代地替换为NaN. 但是,mean不会忽略NaN,而是NaN作为新平均值返回。你可以通过一个小实验看到这一点:

>> mean([3, 4, 2, NaN, 4, 1])
ans = NaN

因此,shearave < 0.2永远不会true

于 2013-01-13T22:16:09.300 回答