如何在SML中编写vmProduct函数实现行向量与矩阵的乘法运算
SML实现行向量与矩阵乘法函数
需求说明
实现vmProduct函数,完成长度为n的行向量与n行m列矩阵的乘法运算,返回长度为m的结果向量。
示例:输入([1,2,3], [[1,1], [2,1], [3,1]])时,返回结果为[14, 6]。
可复用工具函数
现有两个已经实现的工具函数可直接调用:
(* 两个等长向量逐位相加 *) fun vectorAdd(nil, _) = nil | vectorAdd(_, nil) = nil | vectorAdd(a1::first_list, a2::second_list) = (a1 + a2) :: vectorAdd(first_list, second_list); (* 标量与向量相乘,标量乘向量每一个元素 *) fun svProduct(x, y) = map (fn (item) => item * x) y;
vmProduct函数实现
fun vmProduct([], _) = [] | vmProduct(_, []) = [] | vmProduct(v::vs, m::ms) = vectorAdd(svProduct(v, m), vmProduct(vs, ms));
实现逻辑说明
- 边界处理:如果输入向量为空,或者输入矩阵为空,直接返回空列表
- 递归逻辑:
- 取出向量首元素
v、矩阵首行m,调用svProduct计算标量乘结果 - 递归计算剩余向量
vs和剩余矩阵ms的乘积 - 调用
vectorAdd将上述两个结果向量逐位相加,得到当前递归层的返回值
- 取出向量首元素
- 整体逻辑和行向量乘矩阵的数学计算规则完全对应:每个向量元素乘对应矩阵行,所有结果按位求和
测试验证
调用示例代码:
val test_result = vmProduct([1,2,3], [[1,1], [2,1], [3,1]]);
运行后test_result的值为[14,6],符合需求要求。
内容的提问来源于stack exchange,提问作者asworeya shrestha
相关产品推荐
相关产品推荐

