如何从矩阵中排除误差数据并包括拟合值 - Matlab
How to exclude error data from matrix and include fitted values- Matlab
我需要从矩阵中排除一些错误数据。我知道哪些数据是正确的,我正在尝试在两者之间插入值,这样我就可以获得没有那么大错误的体面图表。我必须使用那种形式的矩阵并且我必须保持它的形状。我必须只替换一些标记为错误的数据。我将向您展示我目前的工作:
M=[0.1000
0.6000
0.7000
0.8000
0.9000
0.9500
1.0000
1.0500
1.1000
1.1500
1.2000
1.2500
1.3000
1.5000
1.7500
2.0000
2.2500
2.5000
3.0000];
CZ1=[ 9.4290
9.5000
9.3250
9.2700
9.2950
9.4350
9.6840
10.0690
10.1840
10.2220
10.2160
9.6160
9.6890
9.4880
9.5000
9.5340
9.3370
9.0990
8.5950];
N1=11;
Nn=13;
Mx1=M(N1);
Mx2=M(Nn);
Mx=[Mx1 Mx2]';
CN1=CZ1(N1);
CN2=CZ1(Nn);
CNy=[C1 C2]';
y1=interp1q(Mx,CNy,M(N1:Nn));
CNf=CZ1;
NEWRangeC=y1;
Cfa=changem(CZ1,[NEWRangeC], [CNf(N1:Nn)]);
figure
plot(M,Cf,'-*b',M,Cfa,'r')
就您所见,我使用了点 11 和 13,我排除了点 12,该点从 11 到 13 进行插值。这是可行的,但我想进行修改。
我的问题是:我如何 select 值是错误的并删除它们,但在它们的邻居之间插入 space。我想使用 M 矩阵值作为我的参考(不是点作为我的例子)。
好吧,您可以使用 find
命令找到错误的元素(这将 return 索引)。这也适用于矩阵。
然后您可以抓取每个索引周围的元素,并在它们之间进行插值,就像您所做的那样。
假设您知道哪些元素不正确,您可以使用 Matlab 的 interp1
函数对它们进行插值(这仅在 M
矩阵实际上是向量时有效`:
error_indices = [11 13];
all_indices = 1:length(M)
% Get the indices where we have valid data
all_correct_indices = setdiff(all_indices, error_indices)
% the first two arguments are the available data.
% the third arguments is what indices you are looking for
M_new = interp1(all_correct_indices, M(all_correct_indices), all_indices)
以上在 all_indices
处插入值——包括缺失的元素。在您已有有效数据 (all_correct_indices
) 的情况下,Matlab 将 return 该数据。在其他地方,它将使用两个最近的邻居进行插值。
尝试 help interp1
了解有关此功能如何工作的更多信息。
更新 - 一个例子
x = 1:10; % all indices
y = x*10;
e = 3:7; % the unknown indices
s = setdiff(x, e); % the known indices
y_est = interp1(s, y(s), x)
ans =
10 20 30 40 50 60 70 80 90 100
并且我们看到 interp1 已经使用可用数据(特别是相邻点 20 和 80)线性插值了从 30 到 70 的所有值。
我需要从矩阵中排除一些错误数据。我知道哪些数据是正确的,我正在尝试在两者之间插入值,这样我就可以获得没有那么大错误的体面图表。我必须使用那种形式的矩阵并且我必须保持它的形状。我必须只替换一些标记为错误的数据。我将向您展示我目前的工作:
M=[0.1000
0.6000
0.7000
0.8000
0.9000
0.9500
1.0000
1.0500
1.1000
1.1500
1.2000
1.2500
1.3000
1.5000
1.7500
2.0000
2.2500
2.5000
3.0000];
CZ1=[ 9.4290
9.5000
9.3250
9.2700
9.2950
9.4350
9.6840
10.0690
10.1840
10.2220
10.2160
9.6160
9.6890
9.4880
9.5000
9.5340
9.3370
9.0990
8.5950];
N1=11;
Nn=13;
Mx1=M(N1);
Mx2=M(Nn);
Mx=[Mx1 Mx2]';
CN1=CZ1(N1);
CN2=CZ1(Nn);
CNy=[C1 C2]';
y1=interp1q(Mx,CNy,M(N1:Nn));
CNf=CZ1;
NEWRangeC=y1;
Cfa=changem(CZ1,[NEWRangeC], [CNf(N1:Nn)]);
figure
plot(M,Cf,'-*b',M,Cfa,'r')
就您所见,我使用了点 11 和 13,我排除了点 12,该点从 11 到 13 进行插值。这是可行的,但我想进行修改。
我的问题是:我如何 select 值是错误的并删除它们,但在它们的邻居之间插入 space。我想使用 M 矩阵值作为我的参考(不是点作为我的例子)。
好吧,您可以使用 find
命令找到错误的元素(这将 return 索引)。这也适用于矩阵。
然后您可以抓取每个索引周围的元素,并在它们之间进行插值,就像您所做的那样。
假设您知道哪些元素不正确,您可以使用 Matlab 的 interp1
函数对它们进行插值(这仅在 M
矩阵实际上是向量时有效`:
error_indices = [11 13];
all_indices = 1:length(M)
% Get the indices where we have valid data
all_correct_indices = setdiff(all_indices, error_indices)
% the first two arguments are the available data.
% the third arguments is what indices you are looking for
M_new = interp1(all_correct_indices, M(all_correct_indices), all_indices)
以上在 all_indices
处插入值——包括缺失的元素。在您已有有效数据 (all_correct_indices
) 的情况下,Matlab 将 return 该数据。在其他地方,它将使用两个最近的邻居进行插值。
尝试 help interp1
了解有关此功能如何工作的更多信息。
更新 - 一个例子
x = 1:10; % all indices
y = x*10;
e = 3:7; % the unknown indices
s = setdiff(x, e); % the known indices
y_est = interp1(s, y(s), x)
ans =
10 20 30 40 50 60 70 80 90 100
并且我们看到 interp1 已经使用可用数据(特别是相邻点 20 和 80)线性插值了从 30 到 70 的所有值。