我有一个矩阵A
,即m x n
。我想要做的是计算连续NaN
个元素的数量。如果NaN
元素的数量大于或等于某个任意阈值,则该行中的所有值都将设置为NaN
。
num_obs = sum(isnan(rets), 2);
index = num_obs >= min_obs;
就像我说的那样,我正努力让自己的大脑发挥作用。尝试不同的线下变化,但没有运气。
rets(index==0, :) = rets(index==0, :) .* NaN;
threshold >= 1
的示例数据是:
A = [-7 -8 1.6 11.9;
NaN NaN NaN NaN;
5.5 6.3 2.1 NaN;
5.5 4.2 2.2 5.6;
NaN NaN NaN NaN];
我想要的结果是:
A = [-7 -8 1.6 11.9;
NaN NaN NaN NaN;
NaN NaN NaN NaN;
5.5 4.2 2.2 5.6;
NaN NaN NaN NaN];
答案 0 :(得分:6)
使用
A = magic(4);A(3,3)=nan;
threshold=1;
for ii = 1:size(A,1) % loop over rows
if sum(isnan(A(ii,:)))>=threshold % get the nans, sum the occurances
A(ii,:)=nan(1,size(A,2)); % fill the row with column width amount of nans
end
end
结果
A =
16 2 3 13
5 11 10 8
NaN NaN NaN NaN
4 14 15 1
或者,正如他在评论中提到的@Obchardon你可以矢量化:
A(sum(isnan(A),2)>=threshold,:) = NaN
A =
16 2 3 13
5 11 10 8
NaN NaN NaN NaN
4 14 15 1
作为旁注,您可以轻松地将其更改为列,只需为其他维度执行所有索引:
A(:,sum(isnan(A),1)>=threshold) = NaN;
答案 1 :(得分:1)
您可以使用isnan
来提取A ~= A
元素,而不是NaN
函数。
A(sum((A ~= A),2) >= t,:) = NaN
其中t
是阈值,表示最小数量的现有NaN
元素。