我通过一些计算得到了一个矩阵。
NaN
我必须使用此矩阵进行进一步计算,这些{{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。