如何在循环中加速这个MATLAB代码?

时间:2017-05-20 04:06:48

标签: matlab

我有一个包含1200000行和18列的矩阵。它是交通数据,每一行都是唯一的,第一列是“车辆ID”,第二列是“车架ID”,第16列是“前车ID”。我希望MATLAB从同一帧ID中的整个数据中找到前方车辆的行向量,并将其放在另一个称为PV的矩阵中。如果前方没有车,则放置零矢量。整个矩阵称为“H1”。我使用下面的代码和我使用的工作百分比。但是,它的运行时太慢,16GB内存需要超过14个小时。这对我来说太长了,因为我还有其他10个这样的数据。请帮我把它变得更快更好。

提前致谢。

for i=1:1200000
    i*100/m           % Shows what percent of the work done
    g = H1(H1(:,1)==H1(i,16),:);          
    g = g(g(:,2)==H1(i,2),:);
    if isempty(g)==1
        PV(i,:) = zero(1,:);
    else
        PV(i,[1:17])=g(1,[1:17]);
    end
end

编辑:数据就像一本有10000页的书。每个页面是一个帧ID(页码是帧ID),其中有许多车辆,具有唯一的车辆ID。因此,任何页面都会显示从上方拍摄的图像,此图像中有许多车辆。如果我们将图像以0.1秒的时间间隔连在一起,我们就得到了车辆的驱动胶片。该数据包括车辆的x和y坐标,每个车架可以使用MATLAB中的“plot”命令进行描绘。该数据还包括前车(主车辆前方的车辆),其ID在每排的第16列中。值得注意的是,所有车辆的信息都存在于数据中。如果在主车辆前面没有车辆,则第16列中的数字为零。所以任何一行都只显示一辆车的信息。数据按帧ID排序。

现在我需要从整个矩阵中提取前车的行并将其放在 PV 的矩阵中。问题是当百分比达到约5%时百分比变慢。以下是数据样本:

[629 2033...581]

第一列是车辆ID,第二列是帧ID,第16列是该帧ID中的前车ID。这里车号581位于车架编号629中,车架编号为2033.现在我需要在车架2033中提取车辆ID 581的数据并将其放入PV矩阵中。

更多样本:第一个是车辆ID,第二个是车架ID,第三个是前面的车辆ID。

[629    2033    688 1113433338200   28.703  462.09  6042802.932 2133529.776 56.3    7.9 3   12.8    5.09    3   581 640 95.39]
[577    2033    465 1113433338200   79.392  618.232 6042833.946 2133691.06  17.3    8.4 2   30.19   -0.37   7   0   3362    0]
[580    2033    621 1113433338200   53.4    542.455 6042817.601 2133612.708 18.3    7.5 2   20.49   -0.09   5   572 3361    80.9]
[581    2033    565 1113433338200   27.252  557.481 6042789.779 2133624.359 16.8    7.4 2   21.25   4.19    3   573 629 62.54]

对不起,我会提前解释并感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

在别人的帮助下,我找到了答案:

我们首先需要将每个帧ID提取到一个单元格数组中,然后为每个帧应用代码。

N = max(H1(:,2));
for i=1:N
    display('first')
    i*100/N
    F{i} = H1(H1(:,2)==i,:);
end
F = F(~cellfun(@isempty, F));

此代码划分帧。然后应用:

for j=1:10000
    m = size(F{1,j},1);
    for i=1:m
        i*100/m           % Shows what percent of the work done
        g = F{1,j}(F{1,j}(:,1)==F{1,j}(i,16),:);
        if isempty(g)==1
            F{1,j}(i,[18:34]) = zero(1,:);            % Preceding vehicle
        else
            F{1,j}(i,[18:34]) = g(1,[1:17]);
        end
    end
end

感谢您的帮助。 @hypfco和@ m7913d