将各个代码段转换为循环语句

时间:2018-11-24 20:35:09

标签: matlab

我正在使用包含不同日期(产品订购)中所请求单位的文件在matlab上工作。可以在下一个链接中找到的文件:File

它有4列。第二和第四分别显示日期和单位数。该文件有3000行,我想对文件中的所有整行执行此任务。我将显示的代码的主要任务是,每当在第5列中计算出的值低于300时,就在第6列中填充1。第5列显示了最初为1000的单位数量减少量。我将显示下一个代码:

clear
%Data
File='File.csv';
dataf=csvread(File, 1);
unbl=0;
dataf=[dataf zeros(size(dataf,1),1) zeros(size(dataf,1),1)];
%Loop by pieces
for i=1:size(dataf,1)
    if i==1
        dataf(i,5)=1000-dataf(i,4);
    else
        dataf(i,5)=dataf(i-1,5)-dataf(i,4);
    end
    if dataf(i,5)<300 && dataf(i-1,5)>=300
        dataf(i,6)=1;
    end
end

I1

在第29行中,第5列的值低于300,因此第6列的值为1。第2列中的天数为3。然后,我必须在其中添加4,并在第一次发生这种情况时找到该行。在这种情况下,第一个7。此代码将其保存,并将第5列的值保存在unlb的上一行中:

index =find(dataf(:,6)==1);
index2 = find(dataf(:,2)==dataf(index,2)+4,1);
unbl = unbl+dataf(index2-1,5);

在这一行中,我将有新库存,然后我必须在第5列的实际值中添加数量1200:

dataf(index2,5) = 1200+dataf(index2,5);

我明白了:

I2

因此,从这一点来看,我必须重复相同的任务。我使用以下长代码:

for j=(index2+1):size(dataf,1)
    dataf(j,5)=dataf(j-1,5)-dataf(j,4);
    if dataf(j,5)<300 && dataf(j-1,5)>=300
        dataf(j,6)=1;
    end
end

index =find(dataf(:,6)==1,1,'last');
index2 = find(dataf(:,2)==dataf(index,2)+4,1);
unbl = unbl+dataf(index2-1,5);
dataf(index2,5) = 1200+dataf(index2,5);

for k=(index2+1):size(dataf,1)
    dataf(k,5)=dataf(k-1,5)-dataf(k,4);
    if dataf(k,5)<300 && dataf(k-1,5)>=300
        dataf(k,6)=1;
    end
end

index =find(dataf(:,6)==1,1,'last');
index2 = find(dataf(:,2)==dataf(index,2)+4,1);
unbl = unbl+dataf(index2-1,5);
dataf(index2,5) = 1200+dataf(index2,5);

for l=(index2+1):size(dataf,1)
    dataf(l,5)=dataf(l-1,5)-dataf(l,4);
    if dataf(l,5)<300 && dataf(l-1,5)>=300
        dataf(l,6)=1;
    end
end

index =find(dataf(:,6)==1,1,'last');
index2 = find(dataf(:,2)==dataf(index,2)+4,1);
unbl = unbl+dataf(index2-1,5);
dataf(index2,5) = 1200+dataf(index2,5);

此代码为剩余的一些行执行任务,但是如果我必须完成整个数据集,它将太大。我尝试了一个单循环解决方案,但不幸的是它不起作用:

%One loop (not working)
index=0;
index2=0;
unbl=0;
for i=1:size(dataf,1)
    if i==1
        dataf(i,5)=1000-dataf(i,4);
    else
        dataf(i,5)=dataf(i-1,5)-dataf(i,4);
    end
    if dataf(i,5)<300 && dataf(i-1,5)>=300
        dataf(i,6)=1;
        index =find(dataf(:,6)==1);
        index2 = find(dataf(:,2)==dataf(index,2)+4,1);
    end
    unbl = unbl+dataf(index2-1,5);
    dataf(index2,5) = 1200+dataf(index2,5);
    i=index2+1;
end

我不知道如何更新循环索引以遍历所有行并获取保存在unbl中的累积值。请您帮助将这段代码修复为一个循环语句,以遍历所有行并重现前面提到的任务。非常感谢。

1 个答案:

答案 0 :(得分:0)

这里有一段代码,我相信您可以做您所需要的(内部注释中的解释):

WITH Groups AS(
    SELECT ST.ID,
           ST.[System],
           G.Grp
    FROM dbo.SampleTable ST
         CROSS APPLY (SELECT COUNT(*) AS Grp
                      FROM dbo.SampleTable CA
                      WHERE CA.OrderNo =1
                        AND CA.ID <= ST.ID) G)
SELECT G1.[System] AS Parent,
       G2.[System] AS Child
FROM Groups G1
     LEFT JOIN Groups G2 ON G1.Grp = G2.Grp
                        AND G1.ID = G2.ID - 1;