#matlab
#matlab
Вопрос:
Моя функция Matlab близка к тому, чтобы делать то, что я хочу. Он принимает вектор оценок и генерирует статистику, включая график нормального распределения. Проблема в том, что ось y, похоже, не отражает частоту учащихся, получающих эту оценку.
Изображение графика нормального распределения
Я просмотрел переполнение стека для всех, кто столкнулся с моей проблемой. Я ничего не смог найти.
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]
Комментарии:
1. Привет, FlacOrGtfo! Добро пожаловать в Stack Overflow. Что именно не так с осью Y, которую вы получаете? Являются ли ограничения слишком большими? Слишком маленький? Можете ли вы опубликовать скриншот?
2. Привет, да, вот изображение: i.imgur.com/IR2N27B.png Я бы ожидал больших значений по оси y. Эти значения выглядят слишком маленькими.
3. Совет по переполнению стека: вы можете включить встроенное изображение в свой основной пост, отредактировав его и перетащив файл изображения в область редактирования. Людям легче читать; им не нужно переходить по второй ссылке.
4. Да, они выглядят довольно маленькими.
plot()
обычно значения верны, так что, возможно, с этим выражением что-то происходитf=(1/(dev*sqrt(2*pi)))*exp(-0.5*((v1-ave)/dev).^2);
. Можете ли вы рассказать мне немного больше о том, что это за вычисления? И вы ожидаете, что ось Y увеличится примерно до 1.0 (для общей доли оценок) или больше, как 5 или 10 (для абсолютного числа оценок)?5. Я ожидаю, что числа, подобные 5, будут находиться в верхней части оси y. И тогда это будет больше похоже на 1 в нижней части оси y.
Ответ №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');
Комментарии:
1. Да, гистограмма может быть лучше. Я получил свою функцию для отображения приведенной выше гистограммы. Спасибо за совет.
2. Добро пожаловать! Как насчет того, чтобы дать мне преимущество и принять, если это решило вашу проблему?
3. Хороший ответ. Моим единственным предложением было бы добавить преобразование оси y в целочисленные тики только с учетом данных.