您不需要阅读所有这些代码,但我将其发布以供参考。我需要将以下代码段从0-8更改为n。在案例之间唯一改变的是z的范围和变量名称(msgLength0,msgLength1,msgLength2等)我正在努力。我已经尝试将变量msgLength#放入一个数组中,但是如果没有“count”变量则无法将数据分配给正确的行。
如何在个别情况下摆脱这种“切换”并使用变量而不是单独定义msgLength#?
for these folders
for these files
countmsgLength0= 1;
countmsgLength1= 1;
countmsgLength2= 1;
countmsgLength3= 1;
countmsgLength4= 1;
countmsgLength5= 1;
countmsgLength6= 1;
countmsgLength7= 1;
countmsgLength8= 1;
for x= 1:length(firstinSeq)
for y= 1:length(littledataPassed)
if firstinSeq(x,1)== littledataPassed(y,1) && firstinSeq(x,2)== littledataPassed(y,2)
switch firstinSeq(x,3)
case 0
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == 0),1,'first');
if isempty(indexProcess)
msgLength0(countmsgLength0,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength0(countmsgLength0,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength0= countmsgLength0 + 1;
case 1
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == 0), 1, 'first');
if isempty(indexProcess)
msgLength1(countmsgLength1,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength1(countmsgLength1,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength1= countmsgLength1 + 1;
case 2
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z= 0:1
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength2(countmsgLength2,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength2(countmsgLength2,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength2= countmsgLength2 + 1;
end
case 3
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z= 0:2
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength3(countmsgLength3,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength3(countmsgLength3,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength3= countmsgLength3 + 1;
end
case 4
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z=0:3
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength4(countmsgLength4,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength4(countmsgLength4,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength4= countmsgLength4 + 1;
end
case 5
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z= 0:4
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength5(countmsgLength5,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength5(countmsgLength5,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength5= countmsgLength5 + 1;
end
case 6
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z= 0:5
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength6(countmsgLength6,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength6(countmsgLength6,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength6= countmsgLength6 + 1;
end
case 7
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z=0:6
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength7(countmsgLength7,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength7(countmsgLength7,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength7= countmsgLength7 + 1;
end
case 8
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z=0:7
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength8(countmsgLength8,:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength8(countmsgLength8,:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength8= countmsgLength8+ 1;
end
end
break
end
end
end
msgLength0((countmsgLength0):100,:)= [];
msgLength1((countmsgLength1):1000,:)= [];
msgLength2((countmsgLength2):1000,:)= [];
msgLength3((countmsgLength3):1500,:)= [];
msgLength4((countmsgLength4):1000,:)= [];
msgLength5((countmsgLength5):1000,:)= [];
msgLength6((countmsgLength6):500,:)= [];
msgLength7((countmsgLength7):300,:)= [];
msgLength8((countmsgLength8):300,:)= [];
allmsgLength0(countallmsgLength0:(countallmsgLength0+length(msgLength0(:,1))-1),:) = msgLength0;
allmsgLength1(countallmsgLength1:(countallmsgLength1+length(msgLength1(:,1))-1),:) = msgLength1;
allmsgLength2(countallmsgLength2:(countallmsgLength2+length(msgLength2(:,1))-1),:) = msgLength2;
allmsgLength3(countallmsgLength3:(countallmsgLength3+length(msgLength3(:,1))-1),:) = msgLength3;
allmsgLength4(countallmsgLength4:(countallmsgLength4+length(msgLength4(:,1))-1),:) = msgLength4;
allmsgLength5(countallmsgLength5:(countallmsgLength5+length(msgLength5(:,1))-1),:) = msgLength5;
allmsgLength6(countallmsgLength6:(countallmsgLength6+length(msgLength6(:,1))-1),:) = msgLength6;
allmsgLength7(countallmsgLength7:(countallmsgLength7+length(msgLength7(:,1))-1),:) = msgLength7;
allmsgLength8(countallmsgLength8:(countallmsgLength8+length(msgLength8(:,1))-1),:) = msgLength8;
countallmsgLength0 = countallmsgLength0 + length(msgLength0(:,1));
countallmsgLength1 = countallmsgLength1 + length(msgLength1(:,1));
countallmsgLength2 = countallmsgLength2 + length(msgLength2(:,1));
countallmsgLength3 = countallmsgLength3 + length(msgLength3(:,1));
countallmsgLength4 = countallmsgLength4 + length(msgLength4(:,1));
countallmsgLength5 = countallmsgLength5 + length(msgLength5(:,1));
countallmsgLength6 = countallmsgLength6 + length(msgLength6(:,1));
countallmsgLength7 = countallmsgLength7 + length(msgLength7(:,1));
countallmsgLength8 = countallmsgLength8 + length(msgLength8(:,1));
end
cd ..
end
答案 0 :(得分:6)
答案是,不要使用这样的变量,并在名称中加入数字。它迫使你写这样凌乱的代码。然后,你会发现自己拼命试图调试该代码。最终,您可能会发现错误,可能是在复制/粘贴错误中,您输入了错误编号的变量名称。
相反,使用向量,单元格数组,结构等。将信息存储在数组中,然后索引到该数组/向量/单元格/结构中。您的代码将变得更简单,更容易调试,更短。
答案 1 :(得分:0)
您可以尝试将数组用于countMsgLength
,这样就可以代替countMsgLength4
增加countMsgLength(4)
。
由于msgLengthN
似乎是矩阵,如果所有msgLengthN最终都具有相同的维度,则可以形成一个3d数组,就像一个立方体。您只需要在开始时初始化此数组,然后将相应的元素设置为代码进程。或者,如果msgLengthN
具有不同的维度,您可以使用单元格数组,设置msgLength{N}(countmsgLength(N),:) =
而不是msgLengthN(countmsgLengthN,:)
,就像上面那样。在每次使用之前,将它们初始化为空矩阵,例如,在开始时
msgLength = {};
for k=1:8
msgLength{k} = [];
end
或者,如果您提前知道尺寸,则为零矩阵
msgLength = {};
for k=1:8
msgLength{k} = zeros([rows cols]);
end
除此之外,如果没有一些额外的解释,你似乎很难解释你想要做的事情。
答案 2 :(得分:0)
这是一种摆脱开关/案例的方法。但是,如果您更多地了解了数据的内容以及您希望实现的目标,那么对您来说可能会更有用。最有可能的是,整个分析可以简化很多。
countmsgLength = ones(9,1); %# countmsgLength(1) are the counts for to case 0
msgLength = cell(9,1);
for x= 1:length(firstinSeq)
for y= 1:length(littledataPassed)
if firstinSeq(x,1)== littledataPassed(y,1) && firstinSeq(x,2)== littledataPassed(y,2)
switchNum = firstinSeq(x,3); %# switchNum is 0...8
indexStop = find(firstinSeq(x,4) ~= littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z= 0:switchNum-1 %# if switchNum <2, the loop will execute once
indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ...
littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ...
littledataPassed(y:y+indexStop-1,5) == z), 1, 'first');
if isempty(indexProcess)
msgLength{switchNum+1}(countmsgLength(switchNum+1),:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
else msgLength{switchNum+1}(countmsgLength(switchNum+1),:)= [firstinSeq(x,:) littledataPassed(y+indexProcess-1,:)];
end
countmsgLength(switchNum+1)= countmsgLength(switchNum+1) + 1;
end %# loop z
end %# if
end %# loop y
end %# loop x