提取数组中非 NaN 元素的索引和值的正确方法
Posted
技术标签:
【中文标题】提取数组中非 NaN 元素的索引和值的正确方法【英文标题】:Correct way of extracting indices and values of non-NaN elements in an array 【发布时间】:2014-02-20 05:55:42 【问题描述】:我有一个包含数字和 NaN 元素的数据数组。我想获得 3 个向量,其中包含该数组的非 NaN 元素的索引和各自的值。
这是我的做法:
[x,y]=find(~isnan(A));
[~,~,z]=find(A(~isnan(A)));
现在,这不是最佳选择。首先z
的大小与x
和y
的大小不同(它短了一个元素,我不知道哪个元素被省略了)。其次,我确信可以在一行中做到这两点。
【问题讨论】:
【参考方案1】:您不需要调用find
或isnan
两次,因为您通过第一个命令获得了下标。应用它们以获取 A
中的值:
[ii,jj] = find(~isnan(A));
z = A(sub2ind(size(A),ii,jj))
如果你反对sub2ind
,可以使用ii+(jj-1)*size(A,1)
。
如果您以后不需要ii
和jj
,您可以通过A(~isnan(A))
获得z
(不需要find
)。
【讨论】:
【参考方案2】:您根本不需要第二个find
,只需一点您已经在使用的逻辑索引:
% Example data
A = rand(5);
A(A>0.5) = NaN;
iA = ~isnan(A);
[x,y] = find(iA);
z = A(iA(:));
【讨论】:
谢谢,更笼统地说,您或@chappjc 知道为什么我的代码会给出不同的输出大小吗?我经常使用两者,我不想错过任何东西。 @Jigg:是的。在您第一次调用find
时,您输入了一个与A
相同大小/维度的数组。在对find
的第二次调用中,您已经对A
执行了一些逻辑索引,并且只传入了一个包含A
的非NaN 元素的列向量。如果您查看我的代码,您会发现z
正是您传递给第二个find
的内容。在许多情况下,逻辑索引就足够了,编辑器通常会建议 find
不是必需的。以上是关于提取数组中非 NaN 元素的索引和值的正确方法的主要内容,如果未能解决你的问题,请参考以下文章