我的Matlab函数几乎可以完成我想做的事情。它采用等级向量并生成包括正态分布图的统计信息。问题在于y轴似乎无法反映获得该年级学生的频率。
Image of normal distribution plot
我一直在堆栈溢出中寻找遇到我问题的人。我什么都找不到。
function [M,m,ave,med,dev,v1]=GradeStatistics
% This program accepts grades and gives the maximum, minimum,average(mean),
% median, standard deviation and also sorts the grades for the user.
% This program was written by Jacob
clc;clear;close all;format compact;help GradeStatistics;
disp('Enter a vector containing all grades using square brackets')
v=input('Please give me the grades=');
M=max(v);m=min(v);ave=mean(v);med=median(v);dev=std(v);
v1=sort(v);H={'max';'min';'mean';'median';'std'};
G={M;m;ave;med;dev};clc;disp(table(H,G));
All={'max',M;'min',m;'mean',ave;'median',med;'std',dev};
xlswrite('mygrades.xlsx',All);VV1={'sort',v1};
xlswrite('mygrades.xlsx',VV1,1,'A6');
xlswrite('mygrades.xlsx',v1,1,'B6')
disp('Would you like to see a normal distribution?')
Case = input('Enter Y for yes or N for No=','s');
if lower(Case)=='y'
f=(1/(dev*sqrt(2*pi)))*exp(-0.5*((v1-ave)/dev).^2);
hold on;plot(v1,f);title('Normal Distribution of Grades')
xlabel('Score');ylabel('Students')
elseif lower(Case)=='n'
disp('Thank you for using GradeStatistics')
end
谁能告诉我如何获得更准确地反映坡度矢量的y轴?还请告诉我是否还有其他我需要改进的功能。
示例等级向量:[0 10 20 23 25 30 35 45 50 53 55 56 58 60 62 65 68 73 74 75 78 80 83 85 90 93 95 98 100]
答案 0 :(得分:1)
好的。首先让我们整理一下这段代码。
clc;clear;close all;format compact;help GradeStatistics;
不做大多数事情。 clear
永远不需要在函数开始时使用:所有函数自动从一个新的工作空间开始。 clc
和format compact
应该留给用户使用:您不知道他们的显示偏好是什么。将help
留给用户在需要时拨打电话。另外,请避免使用close all
:您不知道用户是否有一些想要保留的数字!
除非您要在同一个轴上进行多个绘图,否则就不需要调用hold
,而您不在这里。因此,请删除该hold on
通话`。
接下来,让我们重新格式化一下代码。将每个语句放在一行上。由于调试器设置断点并基本上一次运行一行,因此这使得使用Matlab调试器更具可读性,并且更易于调试。并且为了保持可读性,让我们在令牌之间留一些空格。
function [M,m,ave,med,dev,v1] = GradeStatistics
% This program accepts grades and gives the maximum, minimum,average(mean),
% median, standard deviation and also sorts the grades for the user.
% This program was written by Jacob
disp('Enter a vector containing all grades using square brackets')
v=input('Please give me the grades=');
M=max(v);
m=min(v);
ave=mean(v);
med=median(v);
dev=std(v);
v1=sort(v);
H={'max'; 'min'; 'mean'; 'median'; 'std'};
G={M; m; ave; med; dev};
disp(table(H, G));
All={'max',M; 'min',m; 'mean',ave; 'median',med; 'std',dev};
xlswrite('mygrades.xlsx', All);
VV1={'sort', v1};
xlswrite('mygrades.xlsx', VV1, 1, 'A6');
xlswrite('mygrades.xlsx', v1, 1, 'B6');
disp('Would you like to see a normal distribution?')
Case = input('Enter Y for yes or N for No=','s');
if lower(Case) == 'y'
f=(1/(dev*sqrt(2*pi)))*exp(-0.5*((v1-ave)/dev).^2);
plot(v1, f);
title('Normal Distribution of Grades')
xlabel('Score');
ylabel('Students')
elseif lower(Case) == 'n'
disp('Thank you for using GradeStatistics');
end
我不确定您要问的是什么,因为您没有说确切的Y轴/ Y值出了什么问题。但是,既然您说您希望Y轴“反映接受该年级学生的频率”,这听起来好像您想要的是直方图而不是线图? plot()
函数会产生线图。
% Display Histogram
figure
histogram(v, 10);
title('Distribution of grades');