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

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中实现该操作有两种标准方式:

  1. 使用ca.mtimes函数(专门用于矩阵乘法)
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:06:26