如何从矩阵中删除纳米值,保持矩阵大小相同

时间:2015-08-11 16:31:29

标签: matlab matrix

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

NaN

我必须使用此矩阵进行进一步计算,这些{{1}}会影响我的计算吗?如果是这样,那么如何删除这些保持矩阵大小相同?

1 个答案:

答案 0 :(得分:3)

假设您要将矩阵中的值替换为某个有限数字,可以使用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是什么,然后如果我们想要找到每行的平均值,你将创建一个临时数据矩阵来设置{{1} }将值设置为零,然后对每一行求和,除以元素总数减去每行<{1}} 的元素。你减去这么多是因为通过将NaN值设置为0,在找到平均值时不会累积任何东西,但是为了消除这些0值在平均值中的贡献,你需要减去尽可能多的值每行NaN值。

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

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

NaN

基本上,我将1s改为2s,将2s改为1s。