我正在使用包含不同日期(产品订购)中所请求单位的文件在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
在第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);
我明白了:
因此,从这一点来看,我必须重复相同的任务。我使用以下长代码:
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
中的累积值。请您帮助将这段代码修复为一个循环语句,以遍历所有行并重现前面提到的任务。非常感谢。
答案 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;