我确定这里的问题很简单,但我根本无法理解。
我有一个非常简单的数据文件。它是一个带有一列标签的.csv文件,以及一个与每个标签关联的值列。我正在尝试做一些涉及向量的简单操作,但MATLAB一直给我NaN值。
即使我只做mean(vector)
我也会得到NaN!
我无法弄清楚原因。载体中没有NaN值。这都是数字。我键入了命令isnumeric(vector)
并得到了值1.我使用for循环遍历向量中的每个值,并且它们都是数字。
我已将所有数据复制到新的csv文件中并尝试了。还是只给我NaN。
我根本无法弄清楚这里发生了什么。我对其他向量做同样的事情也没有问题。问题是MATLAB不会告诉我问题是什么或者什么,它只给我NaN。
有关正在发生的事情的任何理论,在这里?或者是否有任何想法检查向量以查看MATLAB在阅读时遇到问题的方法?
我在Mac上使用Matlab R2008a。
答案 0 :(得分:3)
这将返回据称为NaN
的数据索引:
find(isnan(vector))
您还可以使用统计工具箱中的nanmean
功能,该功能会忽略数据中的NaN
值。实际上存在许多其他常见统计函数的纳米版本,NaN
通常用于表示数据集中的空值或“缺失”值。
如果NaN
和mean(vector)
出现在Inf
和-Inf
,则mean([-Inf 1 2 3 Inf])
从NaN
获得any(vector==Inf) && any(vector==-Inf)
而您的数据中没有任何此类值的另一种方式。即,find(isinf(vector))
返回find(~isfinite(vector))
。要检查这一点,您可以执行以下操作:
NaN
然后你可以做
{{1}}
找到指数。最后,{{1}}会找到{{1}}和无限值。
答案 1 :(得分:1)
第一个问题是isnumeric
对于NaN和Infs都返回true。以及实际数字。它旨在区分类似数字的值和其他东西(例如,函数句柄或单元格数组)。使用isnan
(检测NaN)或isfinite
(检测Infs和NaN)。
至少应该让你找到NaN,但接下来你需要弄清楚它们来自哪里。 cvsread
并不是特别聪明(它只是在最近的版本中对textscan
的美化调用)并且需要全数字数据。
你有一个带有文本标签的标题行,杂散空格,奇怪格式的底片(例如,会计式的字母组合底片(34)),甚至十六进制/八进制数(例如0x42)?请注意,如果指定范围,整个文件必须是数字 EVEN ,这很奇怪且很烦人。