当前位置:文档之家› CUMCM2012A附件1MATLAB处理数据

CUMCM2012A附件1MATLAB处理数据

% CUMCM2012年A题附件1的数据读取及操作
% 贵州工程应用技术学院(原毕节学院) 赖志柱
% QQ:119227955
% E-Mail:laizhizhu80@https://www.doczj.com/doc/6f3901578.html,
% 数学建模培训 2015年8月
% 仅以附件1中“第一组红葡萄酒品尝评分”的数据读取和操作为例


% 第一步:读取原始数据
% doc xlsread
% 读取附件1中“第一组红葡萄酒品尝评分”
Data = xlsread('附件1-葡萄酒品尝评分表.xls');
% 也可以用下面的方法读取,方便类推读取该附件1中“第二组白葡萄酒品尝评分”等
% Data = xlsread('附件1-葡萄酒品尝评分表.xls','第一组红葡萄酒品尝评分');
% 类似地,读取附件1中“第二组白葡萄酒品尝评分”
% Data4 = xlsread('附件1-葡萄酒品尝评分表.xls','第二组白葡萄酒品尝评分');
% doc xlswrite
[M0,N0] = size(Data); % 确定原始数据的规模,行和列


% 第二步:处理原始数据中的非数值行
% doc find
% doc isnan
ID = isnan(Data); % 检查原始数据中非数值(NaN)的位置,1表示非数值,0表数值
% doc sum
SumID = sum(ID,2); % 求ID中每行的元素值之和
% 检查原始数据中一行全部为NaN的位置,只要上面的行和等于N0的就是非数值行
% (有时可以变通,如检查发现大于8即可认定)
Index = find(SumID == N0);

% 对原始数据删除非数值行,为方便对比先备份
Data1 = Data; %
Data1(Index,:) = []; % 将原始数据删除非数值行后的结果
[M,N] = size(Data1); % 确定数据的的规模,行和列,这里应该N==N0

% 下面根据数据的组织格式:每10行为一个酒样品的评价值(均为N=10列)
% 可以采用变量定义,需要哪个样本直接赋值提取
YangBen3 = Data1(21:30,:); % 读取样本3的数据

YangBen6 = Data1(51:60,:); % 读取样本6的数据

YangBen10 = Data1(91:100,:);% 读取样本10的数据



% 下面是已知样本6的第2行第4个数据缺失,软件读取时变为NaN
% 求样本6的第2行除第4个数据外的平均值
% 这种做法的目的是修正缺失数据
YangBen6(2,4)
sum(YangBen6(2,[1:3,5:N]))/(N-1)
% 由于数据是正整数,所以要加取整,下面两个取整函数效果通常不一样
round(sum(YangBen6(2,[1:3,5:N]))/(N-1))
fix(sum(YangBen6(2,[1:3,5:N]))/(N-1))

% 下面是已知样本10的第1行第3个数据缺失,软件读取时变为NaN
% 求样本10的第1行除第3个数据外的平均值
YangBen10(1,3)
sum(YangBen10(1,[1:2,4:N]))/(N-1)
% 由于数据是正整数,所以要加取整,下面两个取整函数效果通常不一样
round(sum(YangBen10(1,[1:2,4:N]))/(N-1))
fix(sum(YangBen10(1,[1:2,4:N]))/(N-1))

% 下面是读取样本(即某酒样品的评价值)的一般程序
XuHao = 2; % 第2个酒样品的序号
if XuHao < 1,error('输入待查样本序号数不应小于1!');end
if (XuHao >= 1) && (XuHao <= M/10)
QiShiH = (XuHao-1) * 10 + 1;
ZuiHouH = XuHao

*10-1;
YangBen = Data1(QiShiH:ZuiHouH,:);
else
error('输入待查样本序号数超过实际样本数目!');
end


% 第三步:不含非数值行的数据进行缺失数据及异常数据处理
% 对删除了非数值行后的数据进行处理,为方便对比先备份
Data2 = Data1;
Data3 = Data1;
% 查找数据中的非数值型数据所在的行列
[row,col] = find(isnan(Data2));
% row和col的数据是一一对应的
% 比如Data2(row(1),col(1)),Data2(row(2),col(2))等
% 由于数据Data中只有两个非数值型,可以一一处理,最好是循环处理

% 下面的操作方式中,若col(1)的值出现为1或最后一个序号10,
% 则代码[1:col(1)-1,col(1)+1:N]应该会出错的,最好是适当处理
Data2(row(1),col(1)) = fix(sum(Data2(row(1),[1:col(1)-1,col(1)+1:N]))/(N-1));
Data2(row(2),col(2)) = fix(sum(Data2(row(2),[1:col(2)-1,col(2)+1:N]))/(N-1));

% 变通办法如下(如果同一行有多个非数值数据,也会出错)
% NumVec = 1:N;
%
% tNumV = NumVec;
% tNumV(col(1)) = [];
% Data2(row(1),col(1)) = fix(sum(Data2(row(1),tNumV))/(N-1));
%
% tNumV = NumVec;
% tNumV(col(2)) = [];
% Data2(row(2),col(2)) = fix(sum(Data2(row(2),tNumV))/(N-1));



% 读取补充了缺失数据的样本6和10
NYangBen6 = Data2(51:60,:); % 新的样本6(不含非数值了)
NYangBen10 = Data2(91:100,:); % 新的样本10(不含非数值了)

% 输出对比样本6
YangBen6
NYangBen6
% 输出对比样本10
YangBen10
NYangBen10



% 循环处理所有非数值数据
% 下面的代码虽然啰嗦,但对于同一行有多个非数值也适用

% 对于异常数据(如超出某个范围的数据等)可以模仿下述程序处理

SumRow = length(row);
for rr = 1:SumRow
tSum = 0;
tN = 0;
for jj = 1:N
if ~isnan(Data3(row(rr),jj))
tSum = tSum + Data3(row(rr),jj);
tN = tN + 1;
end
end
% 用同一行平均值(取整)补充缺失值
% Data3(row(rr),col(rr)) = fix(tSum / tN);
Data3(row(rr),col(rr)) = round(tSum / tN);
end

% 读取补充了缺失数据的样本6和10
NNYangBen6 = Data3(51:60,:); % 新的样本6(不含非数值了)
NNYangBen10 = Data3(91:100,:); % 新的样本10(不含非数值了)

% 输出对比样本6
YangBen6
NNYangBen6
% 输出对比样本10
YangBen10
NNYangBen10



相关主题
文本预览
相关文档 最新文档