使用逻辑数组索引到矩阵

mHe*_*pMe 2 arrays matlab matrix

我有一个矩阵A,就是这样m x n.我想要做的是计算NaN一行中的元素数量.如果NaN元素的数量大于或等于某个任意阈值,则该行中的所有值都将设置为NaN.

num_obs = sum(isnan(rets), 2);
index = num_obs >= min_obs;
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,我正努力让自己的大脑发挥作用.尝试下面的线的不同变化,但没有运气.

rets(index==0, :) = rets(index==0, :) .* NaN;
Run Code Online (Sandbox Code Playgroud)

示例数据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];
Run Code Online (Sandbox Code Playgroud)

我想要的结果是:

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];
Run Code Online (Sandbox Code Playgroud)

Adr*_*aan 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
Run Code Online (Sandbox Code Playgroud)

结果是

A =

    16     2     3    13
     5    11    10     8
   NaN   NaN   NaN   NaN
     4    14    15     1
Run Code Online (Sandbox Code Playgroud)

或者,正如@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
Run Code Online (Sandbox Code Playgroud)

作为旁注,您可以轻松地将其更改为列,只需为其他维度执行所有索引:

A(:,sum(isnan(A),1)>=threshold) = NaN;
Run Code Online (Sandbox Code Playgroud)