2023年数学建模国赛C题
- 问题1.1
- Q1_1_judge.m
- Q1_1_time.m
- 问题1.2
- Q1_2_1.m
- Q1_2_BP.m
- 技术文档
- 写在最后
目前已经完成E题的第一、二问的代码和文档,分享一部分给大家,欢迎一起来交流谈论哦。
问题1.1
Q1_1_judge.m
clc
clear
data=xlsread('a表.xlsx');
for p=1:size(data,1)fv=data(p,3); %首次体积 for sf=1:8if isnan(data(p,3*(sf+1))) %判断是否为空break endnew_fv=data(p,3*(sf+1));if new_fv-fv>=6||(new_fv-fv)/fv>=0.33if data(p,3*(sf+1)-1)<=48table(p,1)=1;table(p,2)=data(p,3*(sf+1)-1);endendend
end
% for i=1:size(table,1)
% for j=1:2
% if ~table(i,j)
% table(i,j)=NaN;
% end
% end
Q1_1_time.m
clc
clear
data=xlsread('1.1时间计算.xlsx');
for p=1:size(data,1) %遍历每一个人y=data(p,3);m=data(p,4);d=data(p,5);h=data(p,6);min=data(p,7);s=data(p,8);%下面四舍五入小时if s>30if min<59min=min+1; else %min为59min=0;h=h+1; %进一位endendif min>30h=h+1; %不用管是否超过24endmax_sf=data(p,1)-1;if max_sf>8max_sf=8; endfor sf=1:max_sf %遍历每一个随访y_sf=data(p,sf*6+3);m_sf=data(p,sf*6+4);d_sf=data(p,sf*6+5);h_sf=data(p,sf*6+6);min_sf=data(p,sf*6+7);s_sf=data(p,sf*6+8);%下面四舍五入小时if s_sf>30if min_sf<59min_sf=min_sf+1;else %min为59min_sf=0;h_sf=h_sf+1; %进一位endendif min>30h_sf=h_sf+1; %不用管是否超过24endtemp_table=[y m d h;y_sf m_sf d_sf h_sf];if temp_table(1,1)~=temp_table(2,1) %以防万一有隔年的error('停!') endif temp_table(1,2)==temp_table(2,2) %如果月份相同if temp_table(1,3)==temp_table(2,3) %如果月相同日相同gap=temp_table(2,4)-temp_table(1,4); %直接相减else %如果月相同,日不同new_h=temp_table(2,4)+(temp_table(2,3)-temp_table(1,3))*24;gap=new_h-temp_table(1,4);endelse %如果月份不同gap_m=[temp_table(1,2):1:temp_table(2,2)-1]; %获取间隔的月份t_day=get_mday(gap_m(1)); %获取第一个月的天数gap_day_1=t_day-temp_table(1,3); %计算第一个月的天数差额if size(gap_m,2)>=2 %如果中间还有间隔for mm=2:size(gap_m,2)t_day=get_mday(gap_m(mm)); %获取第mm个月的天数gap_day_1=gap_day_1+t_day;endendgap_day=gap_day_1+temp_table(2,3); %总日期间隔new_h=temp_table(2,4)+gap_day*24;gap=new_h-temp_table(1,4);endtable(p,sf)=gap;end
end
for p=1:size(table,1)for j=1:size(table,2)if table(p,j)~=0table(p,j)=table(p,j)+data(p,2);elsetable(p,j)=NaN;endend
end%% 获取每个月的日期数
function t_day=get_mday(m)
m31=[1 3 5 7 8 10 12];
if ismember(m,m31)t_day=31;
elseif m==2t_day=28;
elset_day=30;
end
end
问题1.2
Q1_2_1.m
clc
clear
data1=xlsread('表2-患者影像信息血肿及水肿的体积及位置.xlsx');
data2=xlsread('表3-患者影像信息血肿及水肿的形状及灰度分布.xlsx','Hemo');
table=[];
for i=1:size(data1,1)for ii=1:size(data2,1)if data2(ii,1)==data1(i,1)table=[table;data2(ii,:)];breakendif ii==size(data2,1)table=[table;zeros(1,size(table,2))];endend
end
Q1_2_BP.m
clc
clear
data1=xlsread('因子得分预测表.xlsx');
train1=data1(1:100,:);
test1=data1(1:end,1:30);net=feedforwardnet([10 10 10]);%建立一个隐含层数为1,节点数为10的网络%定义在训练集过程中不使用测试集,只保留训练集与验证集(用于验证泛化能力)
net.divideParam.trainRatio = 80/100;
net.divideParam.valRatio = 20/100;
net.divideParam.testRatio = 0/100;%训练网络。
net=train(net,(train1(:,1:(end-1)))',(train1(:,end))');%注意,这里每一列为一个实例,所以需要转置
%测试效果
test_out=sim(net,(test1)');%测试
test_out=test_out';
for i=1:size(test_out,1)if test_out(i,1)<0test_out(i,1)=0; endif test_out(i,1)>1test_out(i,1)=1; end
end
% test_error=test_out-test1(:,end);
% test_mse = mse(test_error);
% fprintf('%d',test_mse)%% 读出Excel
%观察值(实际值):test1的最后一列
%预测值:test_out。
技术文档
写在最后
下面是国一同学整理的完整代码与运行结果,需要的同学欢迎咨询~