Matlab: избавление от «Switch / Case» в моем коде - PullRequest
0 голосов
/ 28 июля 2010

Вам не нужно будет читать весь этот код, но я разместил его для справки. Мне нужно изменить следующий сегмент кода из случаев 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

Ответы [ 3 ]

6 голосов
/ 28 июля 2010

Ответ: НЕ используйте переменные, подобные этой, с числами, встроенными в имена.Это заставляет вас писать такой грязный код.Позже вы обнаружите, что отчаянно пытаетесь отладить этот код.В конце концов, вы найдете ошибку, возможно, в ошибке копирования / вставки, в которой вы ввели неверно пронумерованное имя переменной.

Вместо этого используйте вектор, массив ячеек, структуру и т. Д. Сохраните вашу информациюв массивах, затем индекс в этот массив / вектор / ячейка / структура.Ваш код станет проще, легче отладится, короче.

0 голосов
/ 28 июля 2010

Вот способ избавиться от переключателя / корпуса. Однако для вас может оказаться более полезным, если вы более подробно объясните, как выглядят ваши данные и чего вы хотели бы достичь. Скорее всего, весь этот анализ можно сильно упростить.

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
0 голосов
/ 28 июля 2010

Не могли бы вы попробовать использовать массив для countMsgLength, чтобы вместо, например, countMsgLength4 вы увеличивали countMsgLength(4).

Поскольку msgLengthN представляется матрицами, вы можете сформировать трехмерный массив, который будет похож на куб, если все msgLengthN окажутся в одном измерении.Вам просто нужно инициализировать этот массив в начале, а затем установить соответствующие элементы в качестве кода progresse.В качестве альтернативы, если msgLengthN s имеют разные размеры, вы можете использовать массив ячеек, задав 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

Кроме этого, без каких-либо дополнительных объяснений, кажется, трудно расшифровать то, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...