??在今年全国数学建模的比赛C题答案处理当中,我发现了一个非常棘手的问题,就是在我们求出答案后,求得的结果和附件中Excel表格的填写方式不同,求解过程中我们所求的答案转运商选择是一个关于403*24周的矩阵,订货量也同样是这样的数量矩阵。 ??其中第一个矩阵是订货量的矩阵,第二个是数只有0-8转运商矩阵,对于下列情况我们就很难实现直接填写,这么庞大的一个数据直接一个一个填写也是不可能的事情。 ??可以观察答案列表是y坐标是公司的编号,而右侧x轴答案每周当中包含了八个编号,所以我们要根据根据我们答案中的两个矩阵的具体含义编写一个算法,使得求出来的总矩阵是符合这样一个格式的,使得我们可以直接粘贴复制。
前置知识点(作者:星夜孤帆): matlab中xlsread函数的用法
function [Answer]=exchange(openfile,rows)
D=xlsread(openfile, 1, rows);
C=xlsread(openfile, 2, rows);
Answer=[];
choose=1;
for i=1:4
if C(i)==0
choose=choose+8;
else
Answer(choose+C(i)-1)=D(i);
choose=choose+8;
end
end
??我们创建一个函数来制作最后的答案矩阵,这个函数是按订货行选择行来操作的,其中D分别为原订货单上每行的数组,C为选择转运商代码矩阵的每行的数组,answer是我们最后转化格式的答案,读出xlsx上表格的数据,然后进行后续操作
??i是对每列的操作即每个周,首选对应C中的当前周选择的转运商,如果没有选择则答案数组中填写8个0,如果选择了某一转运商的话就填写对应C在当前周中的值,即C(i)为当前公司选择的当前转运商,choose为当前在answer中填写的位置,所以choose+C(i)-1就是此公司选择转运商在答案中正确的位置,让后让数位置的choose继续选择下一个周的数值
下面是测试的数据:
1.订货商订货量:
2.当前周转运商选择矩阵: 前置知识点(作者:jk_101与漂洋过海的油条): matlab中sprintf函数的用法 matlab中size函数的用法
处理的中代码:
for j=1:6
k=j+1;
string1='B';string2=':E';
rows=sprintf('%s%d%s%d',string1,k,string2,k);
truerows=exchange('text.xlsx',rows);
[~,k]=size(truerows);
answer(j,1:k)=truerows;
end
??j为有多少公司一行一行的让矩阵分开输入进去,利用sprintf调整xlsread的row行参数,使得它能够一行一行的进行读取,列如当j=1时候,xlsread参数为’B2:E2’会读取此行的数据,通过size获取数组长度即此矩阵的列长,对最后的答案矩阵进行按行赋值。(j,1:k)即对此公司每个周选择的转运商订货量赋值,第j家公司1到:k周的选择。
answer结果矩阵部分结果: ??最后结果,中可以看见这六家公司在第一个周的填写情况,分别选择了 5 4 3 6 1 2转运商的标准答案格式,可直接利用此答案复制粘贴到附件当中。
对与不存在的0值,可以有两种方法去掉: 1.Excel选择取值0点取空 2.利用python处理空值点,下期介绍
|