2013-07-17 2 views
1

Из нижеперечисленного «для циклов» в Matlab я хочу извлечь 150 матриц «Правила» (каждый с размером 1200 * 5), тогда как «Данные» имеет 1200 * 5, «Var1C» 150 * 5 и «Var2C» имеет размер 150 * 5. Спасибо.Как получить много матриц из цикла «for loop» в Matlab

for i = 1:150, 
    for j=1:5, 
     for i1=1:1200, 
      if Var1C(i,j)==1 & Data(i1,j)<Var2C(i,j) | Var1C(i,j)==2 & Data(i1,j)>=Var2C(i,j) 
       Rules = 0; 
      else 
       Rules = 1; 
      end 
     end 
    end 
end 
+1

[Использование '' i' j' и 'i1' в качестве имен переменных в Matlab не Рекоммендуемый] (http://stackoverflow.com/questions/14790740/using-i-and-j-as- переменные-в-MATLAB). 'i1' можно легко путать с' 1i'. – Shai

ответ

3

Ну, вы могли бы иметь 150 х 1200 х 5 матрицы просто при наличии:

Rules = zeros(150,1200,5); % pre-allocate matrix 
for i = 1:150, 
    for j=1:5, 
     for i1=1:1200, 
      if Var1C(i,j)==1 & Data(i1,j)<Var2C(i,j) | Var1C(i,j)==2 & Data(i1,j)>=Var2C(i,j) 
       Rules(i,i1,j) = 0; 
      else 
       Rules(i,i1,j) = 1; 
      end 
     end 
    end 
end 
+4

Вы также можете заменить целочисленную инструкцию if с помощью следующей строки: 'Rules (i, i1, j) = Var1C (i, j) == 1 & Data (i1, j) = Var2C (i, j) ' – Dan

0

Почему вы не векторизации этого ужасного вложенного цикла с использованием ?

Rules = bsxfun(@and, permute(Var1C, [1 3 2]) == 1,... 
         bsxfun(@lt, permute(Data, [3 1 2 ]), permute(Var2C, [1 3 2]))) | ... 
     bsxfun(@and, permute(Var1C, [1 3 2]) == 2,... 
         bsxfun(@ge, permute(Data, [3 1 2 ]), permute(Var2C, [1 3 2]))) ; 
+0

@HughNolan благодарит за редактирование. – Shai

+0

Я должен был проверить, была ли 'bexfun' какая-то функция векторизации, о которой я раньше не слышал;) –

+1

@HughNolan - Я могу применить для позиции« генератор имен функций »в mathworks ... – Shai

Смежные вопросы