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

高斯拟合时矩阵相乘报错:维度不匹配问题求助

解决高斯拟合中的矩阵乘法维度不匹配问题

首先,咱们来定位你遇到的ValueError的核心原因:你试图用numpy矩阵的*运算符去乘两个11×1的列向量,但这个运算符在numpy矩阵中代表的是矩阵乘法(点积),要求左矩阵的列数等于右矩阵的行数——显然1≠11,所以报错。而Matlab里如果是元素级乘法会用.*,推测你在Matlab里实际用的是元素乘,只是numpy矩阵的行为和Matlab不同。

具体修正方案

这里有几种可行的解决办法,根据你的需求选择:

1. 改用numpy数组(推荐)

numpy数组的*运算符默认是元素级乘法,更符合你可能想要的Matlab.*的行为。把代码里的np.matrix换成np.array即可:

import numpy as np
import pandas as pd

spectre = pd.read_csv('spectre.txt')
wl = pd.read_csv('longueur_d_onde.txt')
spectre = spectre - 8000
A = wl.iloc[185:196, 0]
B = spectre.iloc[185:196, 0]

sigma = 2565 / 8192
mu = A[192]
# 改用numpy数组,不需要手动转置
A_ = A.values.reshape(-1, 1)
# 更简洁的方式生成mu的重复列向量
Mu_ = np.full_like(A_, mu)
mu_ = A_ - Mu_

for i in range(100):
    Y = (B / B[192]).values.reshape(-1, 1)
    # 元素级乘法,直接用*
    N = np.exp(-np.power(mu_, 2) / (2 * sigma**2))  # 注意这里用/而不是//,//是整数除法
    print(N * np.power(mu_, 2))  # 现在维度匹配,执行元素乘

2. 用np.multiply()做元素级乘法

如果你坚持使用numpy矩阵,可以用np.multiply()函数明确指定元素级乘法:

# 保留你原来的矩阵定义
N = np.exp(-np.power(mu_, 2) / (2 * sigma**2))
print(np.multiply(N, np.power(mu_, 2)))

3. 如果需要矩阵外积(生成11×11矩阵)

如果你确实想要的是矩阵乘法(比如计算两个列向量的外积,得到11×11的矩阵),那需要转置其中一个向量:

print(N * np.transpose(np.power(mu_, 2)))
# 或者
print(np.transpose(N) * np.power(mu_, 2))

额外的代码优化提示

  • 你原来的Mu_初始化可以用np.full_like()或者np.tile()简化,不需要手动循环赋值
  • 注意//是整数除法,这里计算高斯函数应该用浮点数除法/,否则会丢失精度
  • 循环里的Y和Yt如果没有用到,可以考虑移除或者调整位置,避免重复计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:17:32