-3

这是我绘制测量结果时 Matlab 组装的五行。我需要根据每行的平均值创建一个函数。我正在使用 Matlab,我希望 Matlab 有一个优雅的解决方案来解决我的问题。如果没有,我会接受任何建议。

非常感谢提前

Mike 这里是我的代码的一个小版本:

% 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)
%--------------------------------------------------------------------------
4

1 回答 1

0

对于您的问题,您可以将最后一行替换为:

plot(gewichtPlot,mean([y1; y2; y3; y4; y5]))

但是,您的代码是以非常“非 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已经从向量中获取了相同的元素。这称为“矢量化”

这是另一个例子。我不确定你的变量是什么意思,但我很确定这段代码:

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);

请记住/,无论是在循环中还是在对向量的引用中,用作索引都不是一个好习惯,因为您必须确保结果是整数。

第三,保存数据的更好方法是使用有序矩阵而不是不同的变量。所以不要使用y1to y5,每个尺寸都是 1-by- matAnzahl/naechsterunde,而只有一个y尺寸是 5-by- matAnzahl/naechsterunde,并将其引用为y(1,i)to y(5,i)。这样,您的代码的最后一行将是:plot(gewichtPlot,mean(y))


以上所有内容都是一般性的,在您的情况下,有一种非常简单的方法可以编写整个第二部分,您可以在其中创建所有y向量。本质上,您所做的只是将向量分成五个相等的部分,然后将absolutdurchschnitt它们放入. 因此,如果我们从上面的示例 3中获取与我们完全相同的功能的函数:y1y5reshape

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

还有一些情节的平均值为yby 列反对gewichtPlot

还有很多工作要做,但首先,如果您尝试掌握这些概念会很好。

于 2016-08-18T10:16:50.493 回答