MATLAB中按指定规则合并相加两个列向量的实现问题
实现方案
核心逻辑梳理
首先明确运算规则的落地步骤:
- 初始化输出向量
output,长度与b完全一致,初始首位置赋值为0(符合首位置非1时赋值0的要求,若首位置为1后续会自动覆盖) - 初始化
c_idx变量用于追踪当前要取用的c的元素索引,初始值为0 - 从第二个元素开始遍历
b的每一个位置:- 若当前
b的元素等于1:- 如果是第一次遇到1(即
c_idx == 0):直接将c[c_idx]赋值给当前output位置 - 非首次遇到1:将当前
output上一位的值加上c[c_idx],赋值给当前位置 - 完成赋值后将
c_idx加1
- 如果是第一次遇到1(即
- 若当前
b的元素不等于1:直接将output上一位的值赋值给当前位置
- 若当前
代码实现示例
Python 实现
import numpy as np def generate_output(b, c): n = len(b) output = np.zeros(n) c_idx = 0 for i in range(1, n): if b[i] == 1: if c_idx == 0: output[i] = c[c_idx] else: output[i] = output[i-1] + c[c_idx] c_idx += 1 else: output[i] = output[i-1] return output # 示例测试 b = np.array([0,1,0,1,1,3,1,2,0,1]) c = np.array([0.25, 0.21, 0.33, 0.22, 0.24]) print(generate_output(b, c)) # 输出:[0. 0.25 0.25 0.46 0.79 0.79 1.01 1.01 1.01 1.25] 与示例完全匹配
Matlab 实现
function output = generate_output(b, c) n = length(b); output = zeros(n, 1); c_idx = 1; % Matlab数组索引从1开始 for i = 2:n if b(i) == 1 if c_idx == 1 output(i) = c(c_idx); else output(i) = output(i-1) + c(c_idx); end c_idx = c_idx + 1; else output(i) = output(i-1); end end end % 示例测试 b = [0;1;0;1;1;3;1;2;0;1]; c = [0.25; 0.21; 0.33; 0.22;0.24]; generate_output(b,c) % 输出与示例完全一致
性能说明
该方案时间复杂度为O(n),n为b的长度,即使b长度达到400也完全无性能压力,遍历一次即可完成计算,内存占用仅需要额外存储输出向量和两个索引变量,资源消耗极低。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

