欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

代码逻辑的进修

程序员文章站 2024-03-25 22:55:10
...

代码逻辑的进修

功能需求:

	有两个源的数据,需要分别画出点航迹,然后还需要画出两者关联后的航迹图。
	三条线用不同的颜色区分,所有的数据要根据时间进度进行,即时刻1是1号就画出当前一号的点迹,是二号就画出2号。
	**数据说明:**
	① 1号数据有16000个,2号数据有4000个,关联数据有2万个,一共4万个数据。
	② 数据格式为:源号,批号,时间,经纬度。
	用 matlab 画图。

自己小菜鸟的实现思路

	为了实现这个功能,我先自己初步实现了plot()画图的功能,了解了两个点画线的用法之后开始进行总程序的编写;
	**思路:**
	1、把3部分数据整合到一个data.txt文档中,按照时间进行先后排序;
	2、用for循环遍历 data ,用 find(data(:,1)==1) /2/3 ,先分别保存源号为1, 2,3的数据为,a,b,c 数组;
	3、再一次用 for循环遍历 data ,先判断是否为 源号1,然后在其中找到批号相同的点坐标,把前后两个点画图;
	**问题所在:**
	这个思路非常的按部就班,也是可以实现功能的,但是不是很稳定,因为有时候不知道为什么不会显示2号航迹;最大的问题是代码运行的非常慢,可以简单分析一下,一共四万个数据,在if判断内部,也是要循环遍历来查找相同批号的,加上外循环,大概就是40000*20000吧,这可能永远都不能画完图。
	**改进:**
	然后我这个小菜鸟就开始冥思苦想的想着怎么既能查找到对应的批号,还要把前后相连的两个点连线,结果自然后没有解决!!!

大神师兄的出现

	指导我这一部分的师兄在想了十分钟之后,就给出了一个解决方案,只用遍历一次就ok!膜拜!!!!
	**大神思路:**
	思路就是,只要判断这个点和他上一个点是不是同一个源的同一个批号,如果有相等的就连线,没有就画绘制单点!
	即使思路如此明确!我!依然绞尽脑汁!因为这个项目是临时给的,时间很紧迫,画图也是收尾部分,所以师兄十分钟后发给我一个程序,告诉我自己跑一下试试!!!
	哎,拜读了师兄的程序,逻辑如此之清晰,代码如此之简洁(注释都是我标的),虽然师兄告诉我我是因为对matlab的函数应用不熟练,许多函数不知道才这样的,但是我知道菜鸟就是菜鸟啊,我要努力学习!
	放上师兄的代码!
dataNum = length(Data);
for i=1:dataNum
    yuan=Data(i,1);   %源号
    pi=Data(i,2);     %批号
    res=find(Data(1:i-1,1)==yuan);%在所有数据中找源号对应的索引位置
    res2=find(Data(res,2)==pi);   %在相同源号数据里找批号
    refFinal = res(res2);    %在逻辑1 的里面找对应的标号,然后再去找Data中的索引值
    i   %显示循环次数,用来监测数据操作进度
     if (~isempty(refFinal))
        if(yuan==3)
			plot([Data(refFinal(end),5),Data(i,5)],[Data(refFinal(end),4),Data(i,4)],'.-r');
            hold on;
        elseif(yuan==9)
                 %%% AIS_RadarData(res2(end),5)            %%为了打断点找出 res2 和 res(res2) 的区别
                %%%  AIS_RadarData(refFinal(end),5)
   		    plot([Data(refFinal(end),5),Data(i,5)],[Data(refFinal(end),4),Data(i,4)],'.-g');
            hold on;
        else
  			 plot([Data(refFinal(end),5),Data(i,5)],[Data(refFinal(end),4),Data(i,4)],'.-b');
             hold on;
        end
    else
        if(yuan==3)
            plot(Data(i,5),Data(i,4),'.r','MarkerSize',5);
            hold on;
        elseif(yuan==9)
            plot(Data(i,5),Data(i,4),'.g');
            hold on;
        elseif(yuan==1)
            plot(Data(i,5),Data(i,4),'*b','MarkerSize',5); 
            hold on;
        end
    end
    pause(0.00001);
end

疑问解决:

refFinal = res(res2);
开始一直觉得可以直接用res2来进行判断以及画图啊,而且断点调试的时候,res2和refinal 的矩阵元素都是一模一样的,但是我把refinal 替换成 res2的时候,画图程序就乱掉了。
调试过程:我先让单步调试,看绘图出错的第一个点,后来发现这样没有意义,还是应该直接比较两个索引到的值是不是一样的。所以我添加了下面两句代码,
AIS_RadarData(res2(end),5)
AIS_RadarData(refFinal(end),5)
当res2=5时,AIS_RadarData(res2(end),5) ==data第五行的数值;
AIS_RadarData(refFinal(end),5) ==res第五行对应的9,然后就是data 第九行的数值。

相关标签: 逻辑