Matlab:如何根据其他列中的条目对特定范围内的值求和

Matlab: How to sum up values in a certain range depending on entries in other columns

我是 Matlab 的新手,无法解决以下问题:

我有三个列向量,"Day","Name","Values",每个 300x1,我需要总结 "Values"(累计)在一定范围内,不仅取决于向量"Name",还取决于向量"Day".

更准确地说,我想总结向量 "Values" 中每个类别的值(向量 "Name") 但仅限于一定范围(向量 "Day"),假设我想总结所有 "Values""Day" 2 开始,"Result"-向量应该看起来像(缩写示例):

| 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         |

稍后我想更改范围,例如在 "Day" 2、"Day" 3 之后开始总结,以此类推需要在开始时进行调整"Day".

对于从 "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

有人能帮忙吗? 非常感谢!

我认为函数 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 的元素是否为单个字符。