Matlab: как суммировать значения в определенном диапазоне в зависимости от записей в других столбцах - PullRequest
2 голосов
/ 17 апреля 2020

Я довольно новичок в Matlab и не могу решить следующую проблему:

У меня есть три вектора столбцов, "День", "Имя", "Значения" каждые 300x1, и мне нужно суммировать «Значения» (совокупный) в определенном диапазоне, который зависит не только от вектора «Имя» , но также от вектора «День» .

Точнее , я хочу суммировать значения в векторе "Значения" для каждой категории (вектор "Имя" ) но только для определенного диапазона (вектор "День" ), скажем, я хочу суммировать все "Значения" начиная с "День" 2, «Результат» -вектор должен выглядеть (сокращенный пример):

| Day | Name | Values | Result |
|-----|------|--------|------------|
| 1   | A    | 2      | 0          |
| 1   | C    | 9      | 0          |
| 1   | B    | 7      | 0          |
| 2   | D    | 1      | 1          |
| 2   | B    | 1      | 1          |
| 2   | A    | 3      | 3          |
| 2   | D    | 4      | 5          |
| 3   | D    | 9      | 14         |
| 3   | B    | 1      | 2          |
| 3   | C    | 3      | 3          |
| 3   | A    | 1      | 4          |
| 4   | D    | 3      | 17         |

Позже я хотел бы изменить диапазон, например, начиная суммировать после «День» 2, «День» 3 и т. Д., Которые необходимо настроить для начального «Дня».

Для моего диапазона сумм, начинающегося с " Day " 2 Я создал следующий код, но он не работают вообще:

Result = zeros(size(Values));
a=unique(Name);
for k=1:length(a)
    for i = 1:length(Name)
        if Day(i) > 1
            Result(ismember(Name,a(k)))=cumsum(Values(ismember(Name,a(k))));
        end
    end
end

Кто-нибудь может помочь? Большое спасибо заранее!

1 Ответ

2 голосов
/ 17 апреля 2020

Я не думаю, что функция ismember () - это то, что вам нужно здесь.

Попробуйте использовать другой массив для хранения кумулятивных сумм каждого уникального Name вместе с функцией find () примерно так:

startDay = 2
NameList = unique(Name);
CumulSum = zeros(1, length(NameList));  % Array to store cumulative sum
Result = zeros(1, length(Name));

% For each row in the tabe
for row = 1:length(Name)

  % Check condition on Day
  if (Day(row) >= startDay)

    % Compute the cumulative sum
    % and store it in CumulSum array
    indx = find(NameList == Name(row));
    CumulSum(indx) = CumulSum(indx) + Values(row);

    % Use the cumulative sum as result for the row
    Result(row) = CumulSum(indx);

  end
end

Также будьте осторожны, когда используя unique() на символьных массивах. Возможно, вы захотите убедиться, что элементы Name являются одиночными символами.

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