2013-08-07 52 views
1

我敢肯定,这里的问题很简单,但我根本找不到它。MATLAB给了我NAN的价值,不知道为什么

我有一个非常简单的数据文件。它是一个带有一列标签的.csv文件,以及与每个标签关联的一列值。我正在尝试做一些涉及向量的简单操作,但是MATLAB一直给我提供NaN值。

即使我只是做mean(vector)我得到一个NaN!

我不明白为什么。矢量中没有NaN值。它全是数字。我输入了命令isnumeric(vector)并得到了一个值1.我用一个for循环遍历向量中的每个值,并且它们都是数字。

我已将所有数据复制到一个新的csv文件并尝试过。仍然只是给我NaN。

我根本无法弄清楚这里发生了什么。我没有问题与其他载体一样。问题是MATLAB不会告诉我在哪里或者是什么问题,它只给我NaN。

关于发生了什么的任何理论,在这里?或者有什么方法来检查矢量,看看MATLAB有什么麻烦阅读?

我在Mac上使用Matlab R2008a。

+0

没有看到矢量,我们什么都不能做。但我们不需要。你需要做的是慢慢减少你的输入数据,以隔离导致你的问题的值。做二进制搜索。 –

+0

我意识到这一点,但考虑到有8000个值,我希望人们会对如何分离问题值提出建议。因此,我的帖子中的最后一个问题。解决这个问题的最好方法是什么? –

+0

将您的CSV减半。尝试两边。重复与破碎的一半。这是一个二进制搜索。如果*两半都搞砸了,那么也许你所有的数据都是假的 - 在这种情况下,你可以在这里发布三行。 –

回答

3

这将返回是所谓NaN数据的指标:

find(isnan(vector)) 

您也可以使用统计工具箱,它忽略数据NaNnanmean功能。实际上有许多其他常见统计函数的nan版本,因为NaN通常用于表示数据集中的空值或“缺失”值。

你可能得到mean(vector)NaN没有在你的数据有任何这样的值的另一种方法是,如果既Inf-Inf出现在那里。即,mean([-Inf 1 2 3 Inf])返回NaN。要检查这一点,您可以执行以下操作:

any(vector==Inf) && any(vector==-Inf) 

然后,你可以做

find(isinf(vector)) 

找到索引。最后,find(~isfinite(vector))会找到NaN和无限值。

1

第一个问题是isnumeric对于NaN和Infs都返回true。以及实际的数字。它意在区分类似数字的值和其他事物(例如,函数句柄或单元阵列)。使用isnan(检测NaN)或isfinite(检测Infs和NaNs)。

这应该至少让你找到NaN,但接下来你需要弄清楚它们来自哪里。 cvsread不是特别聪明(它只是在最近版本中对textscan的一个优化呼叫),并且需要全数字数据。

你可以有一个标题行,其中包含文本标签,杂散空格,奇怪格式的否定(例如会计风格父母否定(34))或甚至十六进制/八进制数字(例如0x42)?请注意,如果您指定一个范围,整个文件必须是数字EVEN,这很奇怪,很烦人。

相关问题