【问题标题】:Indexing into matrix with logical array用逻辑数组索引到矩阵
【发布时间】:2017-01-23 15:23:27
【问题描述】:

我有一个矩阵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];

【问题讨论】:

  • 试试这个rets(index, :) = NaN;
  • 例如,如果行中至少有 2 个 NaN,您希望行为 = NaN:M(sum(isnan(M),2)>=2,:) = NaN
  • @obchardon 这对我来说很有意义,但是它不断将我的矩阵 A 变成 NaN 的任何地方
  • 在我的电脑上很好用,你确定是按行算nan,而不是按列算?
  • 是的,一定是我想念的东西。计数在行而不是列上工作

标签: arrays matlab matrix


【解决方案1】:

使用

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;

【讨论】:

  • 矢量化方式将我的矩阵 A 全部变为 NaN,我不明白
【解决方案2】:

您可以使用A ~= A 代替isnan 函数来提取NaN 元素。

A(sum((A ~= A),2) >= t,:) = NaN

其中t 是现有NaN 元素的最小数量的阈值

【讨论】:

  • 您编辑了问题以包含语法正确的 MATLAB 矩阵,但在这两种情况下都错过了左方括号。我会拒绝该编辑,因为除了缩进之外,没有完成问题中的编辑代码。见this meta answer。请不要再次编辑代码,但要保持语法/拼写等方面的良好工作!
  • @Adriaan,我明白了,我忘了把左方括号括起来。我本来可以更小心的!我会记住你的提示!感谢您的提示!
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 2015-07-30
  • 2015-01-08
  • 2012-07-10
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多