You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义Vector类实现向量加法功能?

向量加法的正确实现方式

问题背景

需要实现向量a与向量b的加法,现有自定义Vector类代码如下:

class Vector:
    """
    creates a vector, which can be indexed, changed and added to another vector.
    """
    def __init__(self,n=0,vec=[]):
        """
        creating vecor
        """
        self.n=n
        self.vec=list(vec)
        if len(vec)==0:
            for i in range(n):
                self.vec.append(0)
    def __getitem__(self,i):
        """
        indexing
        """
        if i>=len(self.vec):
            return(None)
        else:
            return(self.vec[i])
    def __setitem__(self,i,val):
        """
        changing
        """
        self.vec[i]=val

尝试添加的add方法如下:

def add(a,b):
        """
        adds vector b to a
        """
        x=0
        for i in b:
            a[x]=a[x]+i
            x+=1
        return (a)

期望支持用法:

a = Vector(vec = [1, 2, 3])
b = Vector(vec = [3, 4, 5])
c = Vector.add(a, b)

问题分析

现有add方法存在几个问题:

  • 未作为类的方法纳入Vector类,无法通过Vector.add(a,b)调用
  • 直接修改原向量a,不符合向量加法返回新向量的数学逻辑(原向量应保持不变)
  • Vector类未实现迭代器方法,直接for i in b会触发报错
  • 未处理两个向量长度不一致的情况

正确实现方案

步骤1:修复原Vector类的初始化隐患

原__init__方法中vec=[]的默认参数是可变对象,会导致多次实例化共享同一个列表,先修正这个问题:

def __init__(self, n=0, vec=None):
    """
    creating vector
    """
    self.n = n
    if vec is None:
        self.vec = [0]*n
    else:
        self.vec = list(vec)
        # 如果传入了vec,更新n为向量实际长度
        self.n = len(self.vec)

步骤2:实现正确的add静态方法

将add方法作为静态方法添加到Vector类中,创建新向量存储结果,同时处理向量长度:

@staticmethod
def add(a, b):
    """
    adds vector b to vector a, returns a new Vector instance
    """
    # 取两个向量的最小长度作为结果向量的长度
    min_len = min(len(a.vec), len(b.vec))
    result_vec = []
    for i in range(min_len):
        result_vec.append(a[i] + b[i])
    # 返回新的Vector实例
    return Vector(vec=result_vec)

步骤3:可选:添加迭代器方法(方便遍历)

如果需要支持直接遍历向量元素,可以给Vector类添加__iter__方法:

def __iter__(self):
    return iter(self.vec)

完整代码

class Vector:
    """
    creates a vector, which can be indexed, changed and added to another vector.
    """
    def __init__(self, n=0, vec=None):
        """
        creating vector
        """
        self.n = n
        if vec is None:
            self.vec = [0]*n
        else:
            self.vec = list(vec)
            self.n = len(self.vec)
    
    def __getitem__(self, i):
        """
        indexing
        """
        if i >= len(self.vec):
            return None
        else:
            return self.vec[i]
    
    def __setitem__(self, i, val):
        """
        changing
        """
        if i < len(self.vec):  # 增加边界检查,避免索引越界
            self.vec[i] = val
    
    def __iter__(self):
        """
        make vector iterable
        """
        return iter(self.vec)
    
    @staticmethod
    def add(a, b):
        """
        adds vector b to vector a, returns a new Vector instance
        """
        min_len = min(len(a.vec), len(b.vec))
        result_vec = [a[i] + b[i] for i in range(min_len)]
        return Vector(vec=result_vec)

# 测试用法
a = Vector(vec=[1, 2, 3])
b = Vector(vec=[3, 4, 5])
c = Vector.add(a, b)
# 输出结果向量的元素
print([item for item in c])  # 输出: [4, 6, 8]

额外优化:支持a + b语法(可选)

如果还想支持Python的加法运算符,可以实现__add__魔法方法:

def __add__(self, other):
    return Vector.add(self, other)

这样就可以直接用c = a + b来实现向量加法。

内容的提问来源于stack exchange,提问作者user20458448

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:46:12