昨天幫同學用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.問題
在處理過程中,發現開頭和結尾的判斷實在有些繞,而且以前很多程序在邊界處都是最容易出錯的,有時間得總結一下這類數據的邊界處理問題。