1

我敢肯定这里的问题很简单,但我根本无法弄清楚。

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

即使我只是这样做,mean(vector)我也会得到一个 NaN!

我不知道为什么。向量中没有 NaN 值。都是数字。我输入了命令isnumeric(vector),得到的值为 1。我使用 for 循环循环遍历向量中的每个值,它们都是数字。

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

我根本无法弄清楚这里发生了什么。我对其他向量做同样的事情没有问题。问题是 MATLAB 不会告诉我问题在哪里或是什么,它只会给我 NaN。

关于发生了什么的任何理论,这里?或者有什么方法可以检查向量以查看 MATLAB 阅读时遇到的问题?

我在 Mac 上使用 Matlab R2008a。

4

2 回答 2

3

这将返回您的数据索引,这些索引应该是NaN

find(isnan(vector))

您还可以使用nanmean统计工具箱中的函数,它会忽略NaN数据中的值。实际上有许多其他常见统计函数的纳米版本,NaN通常用于表示数据集中的空值或“缺失”值。

在数据中没有任何此类值的情况下,您可能获得NaN的另一种方法是如果两者都出现在那里。即,返回。要检查这一点,您可以执行以下操作:mean(vector)Inf-Infmean([-Inf 1 2 3 Inf])NaN

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

然后你可以做

find(isinf(vector))

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

于 2013-08-07T16:35:07.473 回答
1

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

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

你能有一个带有文本标签的标题行、杂散的空格、格式奇怪的负数(例如,会计风格的带括号的负数(34)),甚至是十六进制/八进制数字(例如,0x42)吗?请注意,即使您指定了一个范围,整个文件也必须是数字这很奇怪而且很烦人。

于 2013-08-07T17:30:49.857 回答