假设您想将矩阵中的值替换为某个有限数,您可以使用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。