Matrix-Vector Dot Product(矩阵-矢量点积)
题目链接:
Matrix-Vector Dot Product(矩阵-矢量点积)https://www.deep-ml.com/problems/1
题目描述:
难度:
easy(简单)。
分类:
Linear Algebra(线性代数)。
题目:
编写一个 Python 函数,该函数计算矩阵和向量的点积。如果操作有效,该函数应返回一个表示结果向量的列表;如果矩阵和向量的维度不兼容,则返回 -1。只有当矩阵中的列数等于向量的长度时,矩阵(一个列表的列表)才能与向量(一个列表)进行点积运算。例如,一个 n x m 的矩阵需要一个长度为 m 的向量。
示例:
解释:
矩阵向量点积。
考虑一个矩阵 A 和一个向量 v:
矩阵 A(n×m):
向量v(长度为 m):
点积𝐴⋅𝑣产生一个长度为𝑛的新向量:
关键要求:矩阵中的列数(m)必须等于向量的长度(m)。如果不是,该操作是未定义的,并且函数应返回 -1。
题目解析:
题解如下:
def matrix_dot_vector(a:list[list[int|float]],b:list[int|float])-> list[int|float]:
if len(a[0]) != len(b):
return -1
vals = []
for i in a:
hold = 0
for j in range(len(i)):
hold += (i[j] * b[j])
vals.append(hold)
return vals
代码解释:
1. 函数定义与参数:
def matrix_dot_vector(a:list[list[int|float]], b:list[int|float])-> list[int|float]:
-
定义函数
matrix_dot_vector
,接收两个参数:-
a
:矩阵,形式为列表的列表(list[list[int|float]]
),例如[[1, 2], [2, 4]]
。 -
b
:向量,形式为列表(list[int|float]
),例如[1, 2]
。
-
-
函数返回值类型为
list[int|float]
,即结果向量,若维度不匹配则返回-1
。
2. 维度检查:
if len(a[0]) != len(b):
return -1
-
矩阵的列数由
len(a[0])
获取(假设矩阵非空,题目隐含输入有效性)。 -
检查矩阵列数是否等于向量长度。若不相等,直接返回
-1
,表示维度不兼容。
3. 计算矩阵 - 向量点积:
vals = []
for i in a:
hold = 0
for j in range(len(i)):
hold += (i[j] * b[j])
vals.append(hold)
return vals
-
遍历矩阵的行:外层循环
for i in a
遍历矩阵的每一行。 -
计算每行的点积:
-
内层循环
for j in range(len(i))
遍历当前行的元素,同时通过索引j
匹配向量b
的对应元素。 -
hold += (i[j] * b[j])
实现当前行与向量对应位置元素相乘并累加,得到该行的点积结果。
-
-
收集结果:将每行的点积结果
hold
存入vals
列表,最终返回该列表。
注释版本:
def matrix_dot_vector(a: list[list[int | float]], b: list[int | float]) -> list[int | float]:
# 检查矩阵的列数(通过a[0]的长度获取)是否与向量b的长度相等,这是矩阵和向量能进行点积运算的必要条件
if len(a[0]) != len(b):
return -1 # 若维度不兼容(列数≠向量长度),直接返回-1表示无法运算
vals = [] # 初始化列表,用于存储矩阵与向量点积运算后的结果向量
for row in a: # 遍历矩阵a的每一行
current_sum = 0 # 临时变量,累加当前行与向量点积的结果
for idx in range(len(row)): # 遍历当前行的每个元素,同时通过索引idx获取向量b对应位置的元素
current_sum += row[idx] * b[idx] # 计算当前行元素与向量对应元素的乘积并累加
vals.append(current_sum) # 将当前行的点积结果添加到结果列表中
return vals # 返回最终的点积结果向量
思考总结:
-
数学概念应用:
-
掌握矩阵与向量点积的维度匹配规则(矩阵列数 = 向量长度),这是运算合法性的判断依据。
-
理解点积计算逻辑:矩阵每行与向量对应元素相乘后求和,生成结果向量。
-
-
编程实现逻辑:
-
维度校验:通过
len(a[0]) != len(b)
检查矩阵列数与向量长度,不匹配时直接返回-1
。 -
循环计算:利用双层循环,外层遍历矩阵的行,内层对每行元素与向量对应元素逐项相乘累加,生成结果列表。
-
-
代码能力考察:
-
列表操作(处理嵌套列表矩阵、普通列表向量)、索引访问元素(
row[idx] * b[idx]
)。 -
条件判断与循环结构的综合运用,实现从维度检查到结果计算的完整流程。
-