Matlab:计算误差值并从五个测量中创建函数
Matlab: calculate error value and create function out of five measurements
这是我绘制测量值时 Matlab 组装的五行。我需要根据每行的平均值创建一个函数。我正在使用 Matlab,我希望 Matlab 有一个优雅的解决方案来解决我的问题。如果没有,我会接受任何建议。
非常感谢
迈克
这是我的代码的一个小版本:
% Read text file
clc
clear all
%My Data is stored in that file.
fid = fopen(uigetfile('FILE.txt'), 'rt');
%The next lines are where I create my vectors, read the data, reshape my matrices etc
%I dont think you need to worry about it
%--------------------------------------------------------------------------
nrow = 16;
ncol = 10;
row_index = [9,10,11,12,13,14,15,16,8,7,6,5,4,3,2,1];
col_index = [1,2,3,4,5,6,7,8,9,10];
matAnzahl = 1;
line = '';
naechsterunde = 1;
while strcmp(line,'')
line = fgetl(fid);
C = textscan(line,'%f %f %f %f');
gewicht(matAnzahl) = C{1};
dots(matAnzahl) = C{2};
durchschnitt(matAnzahl) = C{3};
absolutdurchschnitt(matAnzahl) = C{4};
vector = fscanf(fid,'%u',160);
t = 1;
for i = 1:nrow
for j = 1:ncol
data2d(row_index(i), col_index(j)) = vector(t);
t = t + 1;
end
end
data2d;
fgetl(fid);
line = fgetl(fid);
if matAnzahl > 1
if gewicht(matAnzahl) < gewicht (matAnzahl-1)
naechsterunde = naechsterunde + 1;
end
end
matAnzahl = matAnzahl + 1;
end
matAnzahl = matAnzahl - 1;
%--------------------------------------------------------------------------
%This is where I create my y- vectors that are being ploted later on.
%y1-y5 are my results and I need to get the error value out of them and
%I need a function that replaces them
%Thank you
anzahl1 = 1;
for i = 1:matAnzahl/naechsterunde
y1(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y2(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y3(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y4(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y5(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
gewichtPlot(i) = gewicht(i);
i = i + 1;
end
plot(gewichtPlot,y1,gewichtPlot,y2,gewichtPlot,y3,gewichtPlot,y4,gewichtPlot,y5)
%--------------------------------------------------------------------------
对于您的问题,您只需将最后一行替换为:
plot(gewichtPlot,mean([y1; y2; y3; y4; y5]))
但是,你的代码写得非常"non-MATLAB",我给你举几个例子:
首先,你不需要显式增加一个循环的迭代器,它是自动完成的。事实上,改变循环迭代器对循环没有影响。所以:
for i = 1:matAnzahl/naechsterunde
gewichtPlot(i) = gewicht(i);
i = i + 1;
end
可以是:
for i = 1:matAnzahl/naechsterunde
gewichtPlot(i) = gewicht(i);
end
第二个,在这个例子中你甚至不需要循环,这一行:
gewichtPlot(1:matAnzahl/naechsterunde) = gewicht(1:matAnzahl/naechsterunde);
将给出相同的结果,因为 1:matAnzahl/naechsterunde
已经从向量中获取了相同的元素。这叫做"vectorization".
这是另一个例子。我不确定你的变量是什么意思,但我很确定这段代码:
anzahl1 = 1;
for i = 1:matAnzahl/naechsterunde
y1(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
可以切换为:
y1(1:matAnzahl/naechsterunde) = absolutdurchschnitt(1:matAnzahl);
请记住,无论是在循环中还是在对向量的引用中,使用 /
作为索引都不是一个好习惯,因为您必须确保结果是一个整数.
第三,保存数据的更好方法是在有序矩阵中而不是在不同的变量中。所以不要使用 y1
到 y5
,每个大小为 1-by-matAnzahl/naechsterunde
,而只使用一个 y
大小为 5-by-matAnzahl/naechsterunde
,并将其引用为 y(1,i)
到 y(5,i)
。这样你的代码的最后一行将是:plot(gewichtPlot,mean(y))
以上只是一般情况,在你的情况下,有一个 much 简单的方法来编写整个第二部分,你可以在其中创建所有 y
载体。本质上
你所做的只是将 absolutdurchschnitt
向量分成五个相等的部分,并将它们放在 y1
到 y5
中。所以如果我们从上面的例子 3 和函数 reshape
做完全相同的事情,我们得到:
absolutdurchschnitt = randi(100,1,15) % some arbitrary random data
y = reshape(absolutdurchschnitt,5,[]) % create y with all the data
plot(gewichtPlot,mean(y))
这将产生:
absolutdurchschnitt =
Columns 1 through 11
37 63 86 13 18 96 98 26 29 84 81
Columns 12 through 15
37 37 28 26
y =
37 96 81
63 98 37
86 26 37
13 29 28
18 84 26
和一些按列与 gewichtPlot
.
均值 y
的图
还有很多工作要做,但作为开始,如果您尝试掌握这些概念会很好。
这是我绘制测量值时 Matlab 组装的五行。我需要根据每行的平均值创建一个函数。我正在使用 Matlab,我希望 Matlab 有一个优雅的解决方案来解决我的问题。如果没有,我会接受任何建议。
非常感谢
迈克 这是我的代码的一个小版本:
% Read text file
clc
clear all
%My Data is stored in that file.
fid = fopen(uigetfile('FILE.txt'), 'rt');
%The next lines are where I create my vectors, read the data, reshape my matrices etc
%I dont think you need to worry about it
%--------------------------------------------------------------------------
nrow = 16;
ncol = 10;
row_index = [9,10,11,12,13,14,15,16,8,7,6,5,4,3,2,1];
col_index = [1,2,3,4,5,6,7,8,9,10];
matAnzahl = 1;
line = '';
naechsterunde = 1;
while strcmp(line,'')
line = fgetl(fid);
C = textscan(line,'%f %f %f %f');
gewicht(matAnzahl) = C{1};
dots(matAnzahl) = C{2};
durchschnitt(matAnzahl) = C{3};
absolutdurchschnitt(matAnzahl) = C{4};
vector = fscanf(fid,'%u',160);
t = 1;
for i = 1:nrow
for j = 1:ncol
data2d(row_index(i), col_index(j)) = vector(t);
t = t + 1;
end
end
data2d;
fgetl(fid);
line = fgetl(fid);
if matAnzahl > 1
if gewicht(matAnzahl) < gewicht (matAnzahl-1)
naechsterunde = naechsterunde + 1;
end
end
matAnzahl = matAnzahl + 1;
end
matAnzahl = matAnzahl - 1;
%--------------------------------------------------------------------------
%This is where I create my y- vectors that are being ploted later on.
%y1-y5 are my results and I need to get the error value out of them and
%I need a function that replaces them
%Thank you
anzahl1 = 1;
for i = 1:matAnzahl/naechsterunde
y1(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y2(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y3(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y4(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
y5(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
for i = 1:matAnzahl/naechsterunde
gewichtPlot(i) = gewicht(i);
i = i + 1;
end
plot(gewichtPlot,y1,gewichtPlot,y2,gewichtPlot,y3,gewichtPlot,y4,gewichtPlot,y5)
%--------------------------------------------------------------------------
对于您的问题,您只需将最后一行替换为:
plot(gewichtPlot,mean([y1; y2; y3; y4; y5]))
但是,你的代码写得非常"non-MATLAB",我给你举几个例子:
首先,你不需要显式增加一个循环的迭代器,它是自动完成的。事实上,改变循环迭代器对循环没有影响。所以:
for i = 1:matAnzahl/naechsterunde
gewichtPlot(i) = gewicht(i);
i = i + 1;
end
可以是:
for i = 1:matAnzahl/naechsterunde
gewichtPlot(i) = gewicht(i);
end
第二个,在这个例子中你甚至不需要循环,这一行:
gewichtPlot(1:matAnzahl/naechsterunde) = gewicht(1:matAnzahl/naechsterunde);
将给出相同的结果,因为 1:matAnzahl/naechsterunde
已经从向量中获取了相同的元素。这叫做"vectorization".
这是另一个例子。我不确定你的变量是什么意思,但我很确定这段代码:
anzahl1 = 1;
for i = 1:matAnzahl/naechsterunde
y1(i) = absolutdurchschnitt(anzahl1);
if anzahl1 < matAnzahl
anzahl1 = anzahl1 + 1;
end
end
可以切换为:
y1(1:matAnzahl/naechsterunde) = absolutdurchschnitt(1:matAnzahl);
请记住,无论是在循环中还是在对向量的引用中,使用 /
作为索引都不是一个好习惯,因为您必须确保结果是一个整数.
第三,保存数据的更好方法是在有序矩阵中而不是在不同的变量中。所以不要使用 y1
到 y5
,每个大小为 1-by-matAnzahl/naechsterunde
,而只使用一个 y
大小为 5-by-matAnzahl/naechsterunde
,并将其引用为 y(1,i)
到 y(5,i)
。这样你的代码的最后一行将是:plot(gewichtPlot,mean(y))
以上只是一般情况,在你的情况下,有一个 much 简单的方法来编写整个第二部分,你可以在其中创建所有 y
载体。本质上
你所做的只是将 absolutdurchschnitt
向量分成五个相等的部分,并将它们放在 y1
到 y5
中。所以如果我们从上面的例子 3 和函数 reshape
做完全相同的事情,我们得到:
absolutdurchschnitt = randi(100,1,15) % some arbitrary random data
y = reshape(absolutdurchschnitt,5,[]) % create y with all the data
plot(gewichtPlot,mean(y))
这将产生:
absolutdurchschnitt =
Columns 1 through 11
37 63 86 13 18 96 98 26 29 84 81
Columns 12 through 15
37 37 28 26
y =
37 96 81
63 98 37
86 26 37
13 29 28
18 84 26
和一些按列与 gewichtPlot
.
y
的图
还有很多工作要做,但作为开始,如果您尝试掌握这些概念会很好。