MATLAB, как выполнить cumsum, которые выполняют два условия? - PullRequest
0 голосов
/ 08 июля 2010

Этот вопрос относится к Как я могу выполнить эту накопительную сумму в MATLAB? .

Можно ли использовать ДВЕ условия для выполнения кумумирования? или только одно условие?

РЕДАКТИРОВАНИЕ:

data = [1 22 20;...  %# Initial data
        1 22 22;...
        1 22 20;...
        1 44 11;...
        0 44 12;...
        1 33 99;...
        1 33 20;...
        1 33 50];

Я хочу найти накопительную сумму, которая выполнила 2 условия:

% 1) current row in column 1 = 1 && previous row in column 1==1;
% 2) current row in column 2 = previous row in column 2

data(:,4) = cumsum(data(:,3)); % Add a 4th column containing 
                               % the cumulative sum of column 3
index  = diff([0;data(:,1)])> 0 && diff([0;data(:,2); 0])~= 0; 
offset = cumsum(index.*(data(:,4)-data(:,3)));  
data(:,4) = data(:,4)-offset;        
index = (data(:,1) == 0); 
data(index,4) = data(index,3) 

Предполагаемая мощность:

data = [1 22 20 20   >> 20 + 0
        1 22 20 40   >> 20 + 20
        1 44 11 84   >> 11 + 40
        0 44 12 12   >> 12 + 0
        1 33 99 99   >> 99 + 0
        1 33 20 119  >> 20 + 99
        0 33 50 50   >> 50 + 0

Редакция: С кодом ниже я получил неправильный вывод.

index = diff([0;data(:,1)])> 0 & diff([0;data(:,2)])~=0

 1    22    20    20
 1    22    22    42
 1    22    20    62
 1    44    11    73 %this supposed to be 11 not 73 ..
 0    44    12    12
 1    33    99    99
 1    33    20   119
 1    33    50   169

Ответы [ 2 ]

0 голосов
/ 16 августа 2010

После того, как ваш вопрос написан (просто удовлетворяя двум имеющимся условиям), вам нужно выражение для индекса, подобное этому:

index = data(:,1) & ([0;diff(data(:,2))] == 0);

Обратите внимание, что только применяет кумулятивную сумму, если выполняются оба ваших условия (пересмотренные ниже):

  1. строк, где столбец 1 равен 1
  2. строк, где столбец 2 соответствует предыдущей строке или является первой строкой

Для меня это выдает

data(index,4) = cumsum(data(index,3))
data =

     1    22    20    20
     1    22    22    42
     1    22    20    62
     1    44    11     0
     0    44    12     0
     1    33    99     0
     1    33    20    82
     1    33    50   132

Тем не менее, это не даст желаемого результата, поэтому либо ваши условия, либо требуемый вывод неверны.

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

Я медленный и пока не совсем понимаю, что вы пытаетесь сделать.Не могли бы вы описать это словами?Когда вы это сделаете, разделите спецификацию элементов данных массива, с которыми вы хотите работать, и спецификацию кумулятивной суммы. Функция Matlab cumsum не требует каких-либо условий, вы должны написать операторы Matlab, чтобы выбрать данные, которые вы хотите выбрать.хочу суммировать первое.

Ваше второе условие data(1:end-1)==data(2:end) мне кажется подозрительным, поскольку они используют линейное индексирование, что, вероятно, не то, что вам нужно.Если вы не понимаете термин линейное индексирование , попробуйте поэкспериментировать с несколькими ссылками, такими как data (4) и data (24), то есть одномерные индексы в двумерный массив.

Таким образом, утверждение

index = diff([0;data(:,1)])> 0 && diff([0;data(:,2); 0])~= 0;

вызывает ошибки.Здесь вы должны использовать Matlab в интерактивном режиме, чтобы создать оператор, который вы хотите выполнять по частям.Итак,

[0;data(:,1)]

дает ожидаемый результат?Вы понимаете, что он производит?Затем задайте те же вопросы

diff([0;data(:,1)])

, а затем

diff([0;data(:,1)])> 0

и продолжайте.В какой-то момент вы обнаружите, что Matlab не делает то, что вы ожидаете - и это потому, что ваши ожидания неверны.

Наконец, одна вещь, которая определенно неверна, это то, что подвыражения diff([0;data(:,1)])> 0 и diff([0;data(:,2); 0])~= 0 создает векторы различной длины.

РЕДАКТИРОВАТЬ: Оператор & может быть тем, что вы хотите, так как он будет работать поэлементно на двух ваших массивах.

РЕДАКТИРОВАТЬ 2 : Боюсь, у меня больше нет времени, чтобы помочь вам в этом, поэтому я предлагаю вам переписать вашу программу, чтобы явно зациклить массив данных, накапливая накопленную сумму по ходу дела.

...