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