在MATLAB中以特定方式合并和添加两个列向量



我有两个列向量"b";以及";c";

b = [0;1;0;1;1;3;1;2;0;1]
c = [0.25; 0.21; 0.33; 0.22;0.24]

我需要输出矢量

output = [0; 0.25; 0.25; 0.46; 0.79;0.79; 1.01; 1.01; 1.01; 1.25]

每当b的索引位置1中有0或任何数字(1除外(时,它都会将0分配给输出向量。

每当它在b中第一次找到数字1时(在我们的情况下是在b的第二个索引处(,它将从c取0.25并分配给输出向量。

它将在输出向量的其他索引位置保持相同的数字,直到b中有零或任何数字(除了1(,并且每当它在b中找到1时,它将取c的第二个索引,并将像(0.25+0.21 = 0.46)一样相加。

它再次在b的索引位置5找到1,因此它将取c的第三个索引元素,并像(0.46+0.33)一样相加。这个过程还在继续。b和输出向量的大小相同。。。

此外,b中的1的数量等于c 中的元素数量

此外,这只是一个例子,列矢量"的实际大小;b''将类似于400x1。因此,使用循环索引的建议答案就足够了。

您可以在循环中编写如下逻辑,有关详细信息,请参阅注释:

% Define inputs
b = [0;1;0;1;1;3;1;2;0;1];
c = [0.25; 0.21; 0.33; 0.22;0.24];
% Create helper arrays
output = zeros(size(b)); % Output defaults to [0, 0, ...]
cSum = cumsum(c);        % Cumulative sum of "c"
cIdx = 0;                % Current index in "cSum" for output
% Loop over the elements in "b"
for ii = 1:numel(b)
if b(ii) == 1
% If b(ii)=1 then we want to move to the next element in "cSum"
cIdx = cIdx + 1;        
end
if cIdx > 0
% If there has been at least one "1" in b so far then the output
% should be taken from "cSum"
output(ii) = cSum(cIdx);
end
end

或者,您可以在没有循环的情况下执行此操作,但使用相同的底层逻辑。使用cumsum(b==1)可以为要用于输出的c的哪个元素提供索引这给出了相同的结果:

bIdx = cumsum(b==1)+1;
cSum = [0; cumsum(c)];
output = cSum(bIdx);

在您的示例中,这两个都根据需要提供了以下内容:

output = [0; 0.25; 0.25; 0.46; 0.79;0.79; 1.01; 1.01; 1.01; 1.25]

这两者都假设b中的1s的数量小于或等于c中的元素数量,否则它们将出错。

最新更新