Yesterday is history, tomorrow is a mystery, but today is gift. That's why we called it the present. >>>>>>> 点此联系我

[Matlab]一个数据集的处理

昨天帮同学用matlab 处理一个数据,一开始提了需求感觉很好实现啊但上手一弄弄了俩小时,很是蛋疼

1.数据集

有以下数据,以矩阵形式存放在matlab中:

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

2.需求

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

使其变得顺序完整

3.思路

一开始想着直接在原矩阵上动手,发现逻辑有点复杂。1-50中间还好说,但再加上一个50到1的判断着实有些烧脑,所以分批处理吧。将大矩阵分成每个序号都是由小到大的排列的小矩阵放入一个CELL中然后挨个处理,最后再合并这个CELL。

4.实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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.问题

在处理过程中,发现开头和结尾的判断实在有些绕,而且以前很多程序在边界处都是最容易出错的,有时间得总结一下这类数据的边界处理问题。

 

posted @   virter  阅读(5901)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
点击右上角即可分享
微信分享提示