Проблема с индексами Subscript в Matlab - после одного поворота цикла for - PullRequest
0 голосов
/ 28 октября 2018

У меня проблема с моим кодом в Matlab, что довольно странно.У меня есть цикл for, который содержит пару утверждений о некоторых датах, вот код:

for i=1:data_length_Added

  if (month(dateAdded(i)) ~= 0) && (month(dueDate(i)) ~= 0) && (month(dueDate(i)) == month(datePublished(i)))
        [~,idx]=ismember(month(dueDate(i)),kpit(:,1),'rows');% finds the position of an element from the array in the array for months
        kpit(idx,2) =kpit(idx,2) + overdue(i);
        kpit(idx,3) = kpit(idx,3) + 1;
        idx = idx + 1;
  else
        if (month(dateAdded(i)) ~= 0) && (month(datePublished(i)) == (month(dueDate(i)) + 1)) && month(dueDate(i)) ~= 0
              [~,idx]=ismember(month(dueDate(i)),kpit(:,1),'rows');
              [~,idx1]=ismember(month(datePublished(i)),kpit(:,1),'rows');
              year1 = year(datePublished(i));
              weight = (day(datePublished(i)))/eomday(year1,month(datePublished(i)));
              kpit(idx,2) =kpit(idx,2) + overdue(i);
              kpit(idx1,2) =kpit(idx1,2) + overdue(i)*weight;
              kpit(idx,3) = kpit(idx,3)+ 1;
              kpit(idx1,3) = kpit(idx1,3)+ 1;
        else
              if (month(dateAdded(i)) ~= 0) && (month(datePublished(i)) ~= 0) && (month(datePublished(i)) > (month(dueDate(i))+1)) && (month(dueDate(i)) ~= 0)

                    [~,idx]=ismember(month(datePublished(i)),kpit(:,1),'rows');
                    year1 = year(datePublished(i));
                    weight = day(datePublished(i))/eomday(year1,month(datePublished(i))); %Should count all overdue days for full months and weighted overdue days for not full months
                    kpit(idx,2) = overdue(i)*weight;
                    kpit(idx,3) = kpit(idx,3) + 1;

                    for j=month(dueDate(i)) : (month(datePublished(i))-1)
                          [~,idx]=ismember(month(dueDate(i)),kpit(:,1),'rows');
                          kpit(idx,2) =kpit(idx,2) + overdue(i);
                          kpit(idx,3) = kpit(idx,3)+ 1;
                          j = j + 1;
                          month(dueDate(i)) = month(dueDate(i)) + 1;
                    end

              else
                    if (month(dateAdded(i)) ~= 0) && month(dueDate(i)) ~= 0 && month(datePublished(i)) == 0
                          [~,idx]=ismember(month(today),kpit(:,1),'rows');
                          year1 = year(today);
                          weight = day(today)/eomday(year1,month(today)); %Should count all overdue days for full months and weighted overdue dats for not full months
                          kpit(idx,2) = overdue(i)*weight;
                          kpit(idx,3) = kpit(idx,3) + 1;
                          for j=month(dueDate(i)) : (month(today)-1)
                                [~,idx]=ismember(month(dueDate(i)),kpit(:,1),'rows');
                                kpit(idx,2) =kpit(idx,2) + overdue(i);
                                kpit(idx,3) = kpit(idx,3)+ 1;
                                j = j + 1;
                                month(dueDate(i)) = month(dueDate(i)) + 1;
                          end
                    end
              end
        end

  end
end

Итак, проблема в том, что я успешно запускаю код через цикл, и проблема возникает после первогодата у меня в строке 367 (до этого у меня только нули).В принципе, у меня нет проблем с нулями до первого числа, которое фактически попадает в первый вложенный цикл и первое число, проблема возникает после этого.Как вы думаете, что может вызвать проблему с ошибкой индексов индекса я получаю?Спасибо:)))

введите описание изображения здесь

1 Ответ

0 голосов
/ 30 октября 2018

Мне удалось решить мою проблему.Я должен был изменить способ, которым я называю даты, которые являются пустыми в моих утверждениях if.Сначала я установил нули для пустых дат, но после этого я изменил их на NaN, чтобы я мог проверить, когда у меня есть NaN, что делать.Это рабочий код:

mDateAdd = month(dateAdded);
mDatePubl = month(datePublished);
mDueDate = month(dueDate);
mToday = month(today);

         dateAdded(dateAdded == 0) = NaN;
        datePublished(datePublished == 0) = NaN;
        dueDate(dateAdded == 0) = NaN;


     for i=1:data_length_Added
          if mDueDate(i) == mDatePubl(i) && ~isnan(dateAdded(i)) && ~isnan(dueDate(i))
                [~,idx]=ismember(mDueDate(i),kpit(:,1),'rows');% finds the position of an element from the array in the array for months
                kpit(idx,2) =kpit(idx,2) + overdue(i);
                kpit(idx,3) = kpit(idx,3) + 1;
                idx = idx + 1;
          else
                if ~isnan(dateAdded(i)) && (mDatePubl(i)) == (mDueDate(i) + 1) && ~isnan(dueDate(i))
                      [~,idx]=ismember(mDueDate(i),kpit(:,1),'rows');
                      [~,idx1]=ismember(mDatePubl(i),kpit(:,1),'rows');
                      year1 = year(datePublished(i));
                      weight = round((day(datePublished(i)))/eomday(year1,mDatePubl(i)));
                      kpit(idx,2) =kpit(idx,2) + overdue(i);
                      kpit(idx1,2) =kpit(idx1,2) + overdue(i)*weight;
                      kpit(idx,3) = kpit(idx,3)+ 1;
                      kpit(idx1,3) = kpit(idx1,3)+ 1;
                else
                      if ~isnan(dateAdded(i)) && ~isnan(datePublished(i)) && mDatePubl(i) > mDueDate(i)+1 && ~isnan(dueDate(i))

                            [~,idx]=ismember(mDatePubl(i),kpit(:,1),'rows');
                            year1 = year(datePublished(i));
                            weight = (day(datePublished(i))/eomday(year1,mDatePubl(i))); %Should count all overdue days for full months and weighted overdue days for not full months
                            kpit(idx,2) = kpit(idx,2) + round(overdue(i)*weight);
                            kpit(idx,3) = kpit(idx,3) + 1;

                            for j = mDueDate(i) : (mDatePubl(i)-1)
                                  [~,idx]=ismember(mDueDate(i),kpit(:,1),'rows');
                                  kpit(idx,2) =kpit(idx,2) + overdue(i);
                                  kpit(idx,3) = kpit(idx,3)+ 1;
                                  j = j + 1;
                                  mDueDate(i) = mDueDate(i) + 1;
                            end

                      else
                            if ~isnan(dateAdded(i)) && ~isnan(dueDate(i)) && isnan(datePublished(i))
                                  [~,idx]=ismember(mToday,kpit(:,1),'rows');
                                  year1 = year(today);
                                  weight = round(day(today)/eomday(year1,mToday)); %Should count all overdue days for full months and weighted overdue dats for not full months
                                  kpit(idx,2) = overdue(i)*weight;
                                  kpit(idx,3) = kpit(idx,3) + 1;
                                  for j=mDueDate(i) : (mToday-1)
                                        [~,idx]=ismember(mDueDate(i),kpit(:,1),'rows');
                                        kpit(idx,2) =kpit(idx,2) + overdue(i);
                                        kpit(idx,3) = kpit(idx,3)+ 1;
                                        j = j + 1;
                                        mDueDate(i) = mDueDate(i) + 1;
                                  end
                            end
                      end
                end

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