如果我的结构包含-Inf
,Inf
或NaN
条目,我想将其替换为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
答案 0 :(得分:1)
假设您的结构不包含要递归的任何子结构,并且您只想找到Inf
和NaN
的标量值并将其替换为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([])
。
函数fieldnames
和struct2cell
首先用于将结构数组转换为cell array字段名f
和字段内容{{1}的单元格数组}。这将更容易使用。
接下来,cellfun
用于将anonymous function应用于c
的每个单元格。此函数首先检查numeric values,然后检查它们是否为scalar matrices,最后检查它们是否为finite。对于用于索引c
并指定值的值,logical array(对于找到标量true
或Inf
值的单元格返回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