【问题标题】:how to remove nan values from a matrix keeping matrix size same如何从保持矩阵大小相同的矩阵中删除 nan 值
【发布时间】:2015-08-12 00:53:49
【问题描述】:

我通过一些计算得到了一个矩阵。

th1 =

    0.3333    0.6667    0.2500       NaN
    0.5000         0       NaN    0.5000
    0.5000       NaN       NaN       NaN
    0.5000       NaN       NaN       NaN

我必须使用这个矩阵进行进一步的计算,那么这些NaN 会影响我的计算吗?如果是这样,那么我怎样才能删除这些保持矩阵大小相同?

【问题讨论】:

  • 是的,它们可能会影响某些计算,但取决于您在做什么,您希望这样。您不能“删除”它们,但可以替换它们。
  • 应该用什么值代替?
  • 这些 NaN 可以用零代替

标签: matlab matrix


【解决方案1】:

假设您想将矩阵中的值替换为某个有限数,您可以使用isnan 来帮助您完成此操作。

具体来说,你可以这样做:

th1(isnan(th1)) = 0;

这会将所有 NaN 值替换为 0。但是,如果您想删除 NaN 值,则不能在 MATLAB 中对数值矩阵执行此操作,因为 MATLAB 不支持不均匀矩阵。您唯一的选择是元胞数组,您可以做一个元胞数组,其中每个元胞都是矩阵中的一行。

具体来说,你可以这样做:

th1_out = arrayfun(@(x) th1(x,~isnan(th1(x,:))), 1:size(th1,1), 'uni', 0);

使用您的数据,我们得到:

>> celldisp(th1_out)

th1_out{1} =

    0.3333    0.6667    0.2500



th1_out{2} =

    0.5000         0    0.5000



th1_out{3} =

    0.5000



th1_out{4} =

    0.5000

但是,您并没有真正告诉我您打算执行什么计算。根据您要执行的计算,您甚至根本不需要替换任何 NaN 值。你可以简单地忽略它们。例如,假设您想找到矩阵中每一行的平均值。您只需计算每行 NaN 值的总数,并在执行平均值时将其考虑在内。

换句话说:

%// Create a temporary input matrix
th1_temp = th1;

%// Used to indicate what is NaN in your array
num_nan = isnan(th1);

%// Set the NaN values to zero in the temporary matrix
th1_temp(num_nan) = 0;

%// Calculate the average per row
average_th1 = sum(th1_temp, 2) ./ (size(th1,1) - sum(num_nan,2));

上面代码的逻辑是我们在你的矩阵中指出NaN是什么,然后如果我们想找到每一行的平均值,你可以创建一个临时数据矩阵,将NaN的值设置为零,然后对每一行求和并除以元素总数减去每行归类为NaN 的元素。您减去这么多,因为通过将 NaN 值设置为 0,这在找到平均值时不会累积任何东西,但是为了消除这些 0 值在平均值中的贡献,您需要减去尽可能多的 @987654336每行有 @ 值。

在统计工具箱中,也可以使用nanmean 复制上述代码,但如果您无权访问此工具箱,上述代码是可移植的。

如果您想计算每列的平均值,只需对最后一行代码稍作改动即可:

%// Calculate the average per column
average_th1 = sum(th1_temp, 1) ./ (size(th1,2) - sum(num_nan,1));

本质上,我将 1s 更改为 2s,将 2s 更改为 1s。

【讨论】:

  • @user5179049 - 完全没问题。祝你好运!
  • 我正在研究用于预测地震发生概率的半马尔可夫模型。为此,我必须找到区间转换概率。为此,我首先必须计算这个矩阵。它是保持时间质量矩阵。在这里,我必须用零替换这些 nan 值。因为概率不能接近无穷大,所以这个矩阵中的这些 nan 值表示。所以我简单地分配这些零值,这仅仅意味着不可能。
  • @user5179049 - 我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2012-02-13
  • 1970-01-01
相关资源
最近更新 更多