tags:

views:

79

answers:

3

You won't need to read all this code, but I posted it for reference. I need to change the following segment of code from cases 0-8 to just for n. The only thing that changes between cases is the range of z and the variable names (msgLength0,msgLength1,msgLength2 etc.) I am struggling. I have tried putting the variables msgLength# into one array but can't get it to assign the data to the correct lines without the "count" variables.

How can I get rid of this "switch" and use variables instead of seperately defining msgLength# in individual cases?

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
A: 

Could you try using the array for countMsgLength, such that instead of, e.g., countMsgLength4 you increment countMsgLength(4).

Since msgLengthN seem to be matrices, you could form a 3d array, which would be like a cube, if all msgLengthN end up being of the same dimension. You just need to initialize this array at the beginning, and then set the appropriate elements as the code progresse. Alternatively, if msgLengthNs are of different dimensions, you could use a cell array, setting msgLength{N}(countmsgLength(N),:) = instead of msgLengthN(countmsgLengthN,:) like you do above. Just before each use, initialize them to an empty matrix, e.g., at the beginning do

msgLength = {};
for k=1:8
  msgLength{k} = [];
end

or, if you know dimensions ahead of time, to a zero matrix

msgLength = {};
for k=1:8
  msgLength{k} = zeros([rows cols]);
end

Other than this, without some extra explanation it seems difficult to decypher what you're trying to do.

mbudisic
+5  A: 

The answer is, DON'T use variables like this, with numbers built into the names. It forces you to write messy code like this. Then later on, you will find yourself desperately trying to debug that code. Eventually, you will find the error, probably in a copy/paste error, where you have typed an incorrectly numbered variable name.

Instead, use a vector, a cell array, a struct, etc. Store your information in arrays, then index into that array/vector/cell/struct. Your code will get simpler, easier to debug, shorter.

woodchips
Thanks. I am new to matlab and programming in general, but the consensus seems ot be that this is the best way to go.
Maxwell
A: 

Here's a way to get rid of the switch/case. However, it may be more useful for you if you explained more what your data looks like and what you would like to achieve. Most likely, this whole analysis can be simplified a lot.

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
Jonas

related questions