Casadi与Numpy点积差异及Casadi中矩阵点积实现方法
如何在Casadi中实现非等形状输入的矩阵点积操作
问题背景
将PyTorch神经网络转换为Casadi神经网络时,发现Casadi的dot函数要求输入形状完全相同,但Numpy的dot函数支持不同形状的矩阵乘法操作,示例如下:
Numpy示例:
import numpy as np A = np.array([[1, 2, 3]]) B = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) C = np.dot(A, B) # 输出 array([[30, 36, 42]])
Casadi报错示例:
import casadi as ca A = ca.MX(*A.shape) B = ca.MX(*B.shape) C = ca.dot(A, B)
运行后抛出维度不匹配错误:
RuntimeError: .../casadi/core/matrix_impl.hpp:2000: Assertion "x.size()==y.size()" failed: dot: Dimension mismatch
解决方案
Casadi的ca.dot是向量点积,仅支持长度相同的向量输入(或扁平化后长度一致的矩阵),而你当前Numpy中的np.dot执行的是矩阵乘法(1×3 矩阵 × 3×3 矩阵)。在Casadi中实现该操作有两种标准方式:
- 使用
ca.mtimes函数(专门用于矩阵乘法) - 使用Python原生的
@运算符(Casadi的MX/SX类型已重载该运算符)
修改后的Casadi代码示例:
import casadi as ca import numpy as np # 定义原始Numpy数组用于获取形状 A_np = np.array([[1, 2, 3]]) B_np = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) # 创建Casadi符号变量 A = ca.MX(*A_np.shape) B = ca.MX(*B_np.shape) # 方式1:使用mtimes执行矩阵乘法 C1 = ca.mtimes(A, B) # 方式2:使用@运算符执行矩阵乘法 C2 = A @ B # 代入数值验证结果 calc_func = ca.Function('matrix_mult', [A, B], [C1]) result = calc_func(A_np, B_np) print(result) # 输出 [[30, 36, 42]],与Numpy结果一致
额外说明
如果确实需要对矩阵执行向量点积(即扁平化后计算对应元素乘积之和),可以先将矩阵reshape为向量再调用ca.dot:
# 扁平化矩阵后计算向量点积 dot_result = ca.dot(ca.reshape(A, -1), ca.reshape(B, -1)) # 代入数值结果为 1*1 + 2*4 + 3*7 + 1*2 + 2*5 + 3*8 + 1*3 + 2*6 + 3*9 = 144
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

