昨天帮同学用matlab 处理一个数据,一开始提了需求感觉很好实现啊但上手一弄弄了俩小时,很是蛋疼
1.数据集
有以下数据,以矩阵形式存放在matlab中:

可以看出第七列中间缺了一些数,而且每个数是第七列最大能达到50,然后循环往复,一桶油76000+行数据

2.需求
需求就是在顺序空缺处加入一个除第七列以外的全零列,如下:

使其变得顺序完整
3.思路
一开始想着直接在原矩阵上动手,发现逻辑有点复杂。1-50中间还好说,但再加上一个50到1的判断着实有些烧脑,所以分批处理吧。将大矩阵分成每个序号都是由小到大的排列的小矩阵放入一个CELL中然后挨个处理,最后再合并这个CELL。
4.实现
load dataCondence
clearvars -except DATA_Original
BatchMat = [];
kk = 1;
ll = 1;
%矩阵拆分
while 1
while DATA_Original(kk+1,7)-DATA_Original(kk,7)>=0
if kk<(size(DATA_Original,1)-1)
BatchMat = [BatchMat;DATA_Original(kk,:)];
kk = kk + 1;
else
break;
end
end
BatchMat = [BatchMat;DATA_Original(kk,:)];
CellMat{ll} = BatchMat;
BatchMat = [];
ll = ll+1;
kk = kk+1;
if kk==(size(DATA_Original,1))
break;
end
end
%处理小矩阵
for nCycle = 1:numel(CellMat)
DATA = CellMat{nCycle};
iterMat = [];
orderMat = [];
curOrder = 0;
%处理开头序列
if DATA(1,7) ~= 1
for j=1:DATA(1,7)-1
orderMat = [orderMat;curOrder+1];
curOrder = curOrder + 1;
end
curOrder = 0;
iterMat = [iterMat;[zeros(DATA(1,7)-1,6),orderMat,zeros(DATA(1,7)-1,6)]];
orderMat = [];
end
%处理中间数据
for i = 1:size(DATA,1)-1
iterMat = [iterMat;DATA(i,:)];
if DATA(i+1,7)-DATA(i,7) > 1
diff = DATA(i+1,7)-DATA(i,7)-1;
curOrder = DATA(i,7);
if diff~=0
for j=1:diff
orderMat = [orderMat;curOrder+1];
curOrder = curOrder + 1;
end
curOrder = 0;
iterMat = [iterMat;[zeros(diff,6),orderMat,zeros(diff,6)]];
orderMat = [];
end
end
end
iterMat = [iterMat;DATA(i+1,:)];
CellMat_NEW{nCycle} = iterMat;
end
%合并矩阵
CombMat = [];
for i = 1:numel(CellMat_NEW)
CombMat = [CombMat;CellMat_NEW{i}];
end
5.问题
在处理过程中,发现开头和结尾的判断实在有些绕,而且以前很多程序在边界处都是最容易出错的,有时间得总结一下这类数据的边界处理问题。