MATLAB:删除Inf或NaN

时间:2017-07-13 11:21:41

标签: arrays matlab object structure

如果我的结构包含-InfInfNaN条目,我想将其替换为0或空。这是可能的,如果是这样,将如何实施?它还需要适用于嵌套数据。

Isinf()isnan()无法处理结构数组。

示例:

test(1).a = 1;
test(2).a = Inf;
test(1).b = NaN;
test(2).b = 2;

然而,字段名称可以是任何内容,并且应该被认为是未知的。这个结构打印出来像这样:

a b 1 1 NaN 2 Inf 2 

我希望如此:

a b 1 1 0 2 0 2

2 个答案:

答案 0 :(得分:1)

假设您的结构不包含要递归的任何子结构,并且您只想找到InfNaN标量值并将其替换为0或[],以下是您可以轻松完成此操作的方法:

s = struct('a', {1, Inf}, 'b', {NaN, 2});  % Sample data

f = fieldnames(s);   % Get field names
c = struct2cell(s);  % Convert structure to a cell array
[c{cellfun(@(d) isnumeric(d) && isscalar(d) && ~isfinite(d), c)}] = deal(0);
s = cell2struct(c, f, 1);  % Rebuild structure array

输出:

s(1)

ans = 
  struct with fields:
    a: 1
    b: 0

s(2)

ans = 
  struct with fields:
    a: 0
    b: 2

如果您希望空字段多于零,则可以将deal(0)替换为deal([])

工作原理......

函数fieldnamesstruct2cell首先用于将结构数组转换为cell array字段名f和字段内容{{1}的单元格数组}。这将更容易使用。

接下来,cellfun用于将anonymous function应用于c的每个单元格。此函数首先检查numeric values,然后检查它们是否为scalar matrices,最后检查它们是否为finite。对于用于索引c并指定值的值,logical array(对于找到标量trueInf值的单元格返回NaN) 0使用deal

最后,使用cell2struct使用c中的原始字段名称和f中修改后的字段内容重构结构数组。

答案 1 :(得分:0)

<强>解决方案

使用MATLAB的isnan和isinf函数如下:

mat(isinf(mat) | isnan(mat)) = 0;

示例

%defines input matrix
mat = rand(3,3); mat(1,1) = nan;
mat(2,3) = inf;mat(2,2) = -inf;

%replaces nans and infs with zeros
mat(isinf(mat) | isnan(mat)) = 0;

<强>结果

mat =

0    0.0357    0.6787
0.9595         0         0
0.6557    0.9340    0.7431