2017-02-15 22 views
-1

Моя цель: в зависимости от того, какой из 5 сценариев распространен в каждой строке, выполните вычисления, следуя инструкциям if. Конечный результат должен быть 1 столбец, включая результат каждой строки calc.Расчеты по парным ячейкам, которые соответствуют нескольким заданным критериям?

То, что я пытался до сих пор:

CalcOutcome = zeros(554,1); 
    for k=height(MomPF) 
     if MomPF.L_sum4t<0 & MomPF.U_sum4t>0   
      % make calc for every row but end result should only be 1 column 
      % with the calc outcomes 
      CalcOutcome=(-1)*MomPF.L_sum4t{k}*0.5 + MomPF.U_sum4t{k}*0.5; 
     elseif MomPF.L_sum4t<0 & MomPF.U_sum4t<0 
      CalcOutcome=(-1)*MomPF.L_sum4t{k}*1; 
     elseif MomPF.L_sum4t>0 & MomPF.U_sum4t>0 
      CalcOutcome=MomPF.U_sum4t{k}*1; 
     elseif MomPF.L_sum4t>0 & MomPF.U_sum4t<0 
      CalcOutcome=MomPF.L_sum4t{k}*0.5 + (-1)*MomPF.U_sum4t{k}*0.5; 
     elseif MomPF.L_sum4t==0 & MomPF.U_sum4t==0 
      CalcOutcome=0   
     end 
    end 

Таблица: enter image description here

+0

Что вы хотите сказать? – excaza

+0

@excaza, смотрите выше (раздел цели) – John

+3

Вопрос обычно заканчивается вопросительным знаком. (Пожалуйста, не добавляйте «Как достичь этой цели?». [Это] (http://stackoverflow.com/help/how-to-ask) может помочь.) – dasdingonesin

ответ

1

Как уже упоминалось, похоже, что проблема индексации. Тем не менее, вам не нужно цитировать - вы должны иметь возможность сделать все это сразу с индексацией таблицы. Например, что-то вроде:

idx = (MomPF.L_sum4t < 0) & (MomPF.U_sum4t > 0); CalcOutcome(idx) = -0.5*MomPF.L_sum4t(idx) + 0.5*MomPF.U_sum4t(idx);

, а затем промыть и повторить для других условий.

+0

большое спасибо! Точно делайте то, что я намеревался сделать после повторения для других случаев. – John

1

Я не имею данных, чтобы проверить, но я бы сказал, что вы забыли проиндексировать!

CalcOutcome = zeros(554,1); 
    for k=height(MomPF) 
     if MomPF.L_sum4t(k)<0 & MomPF.U_sum4t(k)>0   
      % make calc for every row but end result should only be 1 column 
      % with the calc outcomes 
      CalcOutcome(k)=(-1)*MomPF.L_sum4t(k)*0.5 + MomPF.U_sum4t(k)*0.5; 

     elseif MomPF.L_sum4t(k)<0 & MomPF.U_sum4t(k)<0 
      CalcOutcome(k)=(-1)*MomPF.L_sum4t(k)*1; 

     elseif MomPF.L_sum4t(k)>0 & MomPF.U_sum4t(k)>0 
      CalcOutcome(k)=MomPF.U_sum4t(k)*1; 

     elseif MomPF.L_sum4t>(k)0 & MomPF.U_sum4t(k)<0 
      CalcOutcome(k)=MomPF.L_sum4t(k)*0.5 + (-1)*MomPF.U_sum4t(k)*0.5; 

     elseif MomPF.L_sum4t(k)==0 & MomPF.U_sum4t(k)==0 
      CalcOutcome(k)=0   
     end 
    end 

Вы перебираете k, пользуетесь им.

+0

, это то, что я пробовал в первую очередь, но произошли следующие ошибки, поэтому я сбросил '{k}' 'в операторы if ' Ссылка на содержимое ячейки из неячейки объект массива. Ошибка в matlab.internal.table.numArgumentsFromSubscriptRecurser (строка 7) n = numArgumentsFromSubscript (a, s, ctxt); ошибок в табличной/numArgumentsFromSubscript (строка 61) зг = matlab.internal.table.numArgumentsFromSubscriptRecurser (х, s (2: конец), контекст); ' – John

+1

На основе захвата экрана вы предоставили,' MomPF.L_sum4t' является а не ячейку, поэтому вы не можете индексировать ее содержимое с фигурными фигурными скобками. Вы хотите регулярные фигурные скобки: 'MomPF.L_sum4t (k)'. – CKT

+1

@John ......... Это совершенно другое дело, что вы просили. И это потому, что '{k}' -> '(k)'. Попробуйте текущее редактирование. Для дальнейшего использования не спешите читать [ask], и очень важно, [mcve] –