我的数据是3640个数据点,出错 false_nearest_neighbors (第 13 行) X(i, j) = x((i - 1) * tau + j);
时间: 2024-01-21 11:03:02 浏览: 25
出现这个错误可能是因为你的数据不够长,导致在确定嵌入维度时,重构后的数据矩阵 `X` 的行数变少,进而导致索引 `(i-1)*tau+j` 越界。
你可以尝试减小 `max_dim`,或者添加一些判断条件,避免出现越界的情况。
例如,修改后的代码如下:
```matlab
function dim = false_nearest_neighbors(x, max_dim, tau, eps)
% 使用虚假最近邻点法确定嵌入维度
N = length(x);
fnn = zeros(max_dim, 1);
for dim = 1:max_dim
% 重构
n = N - (dim - 1) * tau;
if n <= 0
break;
end
X = zeros(n, dim);
for i = 1:n
for j = 1:dim
idx = (i - 1) * tau + j;
if idx <= N
X(i, j) = x(idx);
else
break;
end
end
end
% 计算最近邻点
k = 4;
[idx, dist] = knnsearch(X, X, 'K', k+1);
dist = dist(:, 2:end);
% 计算虚假最近邻点数
r = eps * max(max(dist));
fnn(dim) = sum(any(dist > r, 2)) / n;
end
% 找到第一个虚假最近邻点数大于 10% 的嵌入维度
dim = find(fnn > 0.1, 1);
end
```
其中,加入了一个判断条件 `if idx <= N`,如果索引越界则退出循环。同时,如果重构后的数据矩阵 `X` 行数小于等于 0,则退出循环,这样可以避免在维度过大时出现问题。