% 读取数据 data = readtable('附件1.csv'); % load('data.mat') PreserveVariableNames=true % 数据清洗和预处理 data(isnan(data.Score),:) = []; % 删除缺失值 data = sortrows(data,{'Class','Course','TestNo','StuId'}); % 按班级、课程、测试和学生ID排序 % 统计每门课的平均分、最高分、最低分、标准差等指标 stat_course = grpstats(data,{'Course'},{'mean','max','min','std'}); disp(stat_course); data = double(data); % 将data转换为double类型 % 统计每个班级、每个学院的平均分、最高分、最低分、标准差等指标 stat_class = grpstats(data,{'Class'},{'mean','max','min','std'}); stat_college = grpstats(data,{'College'},{'mean','max','min','std'}); disp(stat_class); disp(stat_college); % 计算每个班级和学院的成绩得分 score_class = zeros(max(data.Class),1); score_college = zeros(max(data.College),1); for i = 1:max(data.Class) idx = data.Class == i; score_class(i) = mean(data.Score(idx)); end for i = 1:max(data.College) idx = data.College == i; score_college(i) = mean(data.Score(idx)); end % 选出成绩得分最高的5个班级和3个学院 [~,idx_class] = sort(score_class,'descend'); [~,idx_college] = sort(score_college,'descend'); disp(['Top 5 classes: ',num2str(idx_class(1:5)')]); disp(['Top 3 colleges: ',num2str(idx_college(1:3)')]); % 计算每个学生的成绩得分 alpha = [0.2,0.2,0.2,0.2,0.2]; % 权重 score_student = zeros(size(data,1),1); for i = 1:size(data,1) score_student(i) = alpha(1)*data.Att1(i) + alpha(2)*data.Att2(i) + alpha(3)*data.Att3(i) + alpha(4)*data.Att4(i) + alpha(5)*data.Att5(i); end % 选出成绩得分最高的60名学生和成绩得分最低的60名学生 [~,idx_student] = sort(score_student,'descend'); disp(['Top 60 students: ',num2str(data.StuId(idx_student(1:60)))]); disp(['Bottom 60 students: ',num2str(data.StuId(idx_student(end-59:end)))]);帮我改进一下这段代码
时间: 2023-12-15 11:03:14 浏览: 113
irisdata.zip_MATLAB导入 iris_iris_iris.data.mat_iris_data.mat_iris
5星 · 资源好评率100%
这段代码已经比较简洁和高效了。以下是一些建议:
1. 增加注释,使代码更易读。
2. 可以将`score_class`和`score_college`的计算改成一行代码,如下所示:
```
score_class = grpstats(data,{'Class'},'mean');
score_college = grpstats(data,{'College'},'mean');
```
3. 可以将计算`score_student`的循环改成向量化,如下所示:
```
score_student = alpha * [data.Att1'; data.Att2'; data.Att3'; data.Att4'; data.Att5'];
```
4. 可以将选出成绩得分最高/低的班级、学院、学生的代码封装成函数,提高代码的复用性。
5. 可以使用`fprintf`代替`disp`,使输出更加规范。
下面是改进后的代码:
```
% 读取数据
data = readtable('附件1.csv','PreserveVariableNames',true);
% 删除缺失值
data(isnan(data.Score),:) = [];
% 按班级、课程、测试和学生ID排序
data = sortrows(data,{'Class','Course','TestNo','StuId'});
% 统计每门课的平均分、最高分、最低分、标准差等指标
stat_course = grpstats(data,{'Course'},{'mean','max','min','std'});
fprintf('Statistics by Course:\n');
disp(stat_course);
% 统计每个班级、每个学院的平均分、最高分、最低分、标准差等指标
stat_class = grpstats(data,{'Class'},{'mean','max','min','std'});
stat_college = grpstats(data,{'College'},{'mean','max','min','std'});
fprintf('Statistics by Class:\n');
disp(stat_class);
fprintf('Statistics by College:\n');
disp(stat_college);
% 计算每个班级和学院的成绩得分
score_class = grpstats(data,{'Class'},'mean');
score_college = grpstats(data,{'College'},'mean');
fprintf('Top 5 classes: %s\n',num2str(getTopN(score_class,5)));
fprintf('Top 3 colleges: %s\n',num2str(getTopN(score_college,3)));
% 计算每个学生的成绩得分
alpha = [0.2,0.2,0.2,0.2,0.2]; % 权重
score_student = alpha * [data.Att1'; data.Att2'; data.Att3'; data.Att4'; data.Att5'];
% 选出成绩得分最高/低的学生
fprintf('Top 60 students: %s\n',num2str(getTopN(data.StuId,score_student,60)));
fprintf('Bottom 60 students: %s\n',num2str(getTopN(data.StuId,score_student,60,true)));
% 封装函数:获取排名前N的元素
function topN = getTopN(elements,scores,N,reverse)
if nargin < 4
reverse = false;
end
[~,idx] = sort(scores,'descend');
if reverse
idx = fliplr(idx);
end
topN = elements(idx(1:N));
end
```
阅读全文