Matlab循环转Python时矩阵运算报错,求sum(-4*f*d(i))改写方法
问题:Matlab代码转Python时sum运算的维度错误
原Matlab代码
for j=1:n for i=1:m a1(i,j) = sum(-4*f*d(i))*log(NormPS{i,j}(f1:f2))); end end
参数说明
- n=55,m=103
- f为1×441维度矩阵(可设随机值)
- f1=10,f2=450,
log(NormPS{i,j}(f1:f2))生成441×1维度矩阵 - d为1×103维度矩阵
尝试的Python代码及报错
代码片段
for j in range(np.int64(n)): for i in range(np.int64(m)): a= -np.mat(4)*np.mat(f)*np.mat(d[:i]) b=np.log((NormPS[i,j] [(d).astype(int)]).reshape(-1,1)) #check=(d[:i])
报错信息
error : shapes (1,441) and (0,103) not aligned: 441 (dim 1) != 0 (dim 0)
报错追踪
Traceback (most recent call last): File ~\Desktop\spyder_files\2D_spyder_file\algebra_2D_spyder.py:48 in <module> a= -np.mat(4)*np.mat(f)*np.mat(d[:i]) File ~\anaconda3\lib\site-packages\numpy\matrixlib\defmatrix.py:218 in mul return N.dot(self, asmatrix(other)) File <__array_function__ internals>:5 in dot ValueError: shapes (1,441) and (0,103) not aligned: 441 (dim 1) != 0 (dim 0)
核心疑问
如何正确改写a=sum(-4*f*d(i))?确认问题出在d(i)的处理上。
解决方案
问题根源
- 索引逻辑错误:Matlab中
d(i)是取第i个标量元素,而你用d[:i]是取前i个元素,且Python的range(m)从0开始,当i=0时d[:0]是空数组,直接导致维度不匹配。 - 不必要的矩阵转换:用
np.mat强制转矩阵反而复杂化了运算,numpy原生数组运算更简洁高效。
正确改写代码
import numpy as np # 提前初始化结果数组,需和原Matlab的a1维度一致(m×n) a1 = np.zeros((m, n)) for j in range(n): for i in range(m): # 对应Matlab的sum(-4*f*d(i)):d[i]是标量,和f做元素乘法后求和 sum_val = np.sum(-4 * f * d[i]) # 保留你已验证正确的log部分(注意原Matlab代码多了一个右括号,需修正) log_val = np.log((NormPS[i,j][f1:f2]).reshape(-1,1)) # 赋值给结果数组 a1[i, j] = sum_val * log_val
补充说明
- 如果f是一维数组
(441,)、d是一维数组(103,),numpy会自动处理标量与数组的广播乘法,无需额外维度调整。 - 避免用
np.mat,numpy的ndarray更灵活:元素乘法用*,矩阵乘法用@,这里只需元素乘法。 - 原Matlab代码中
log(...)部分多了一个右括号,需注意语法正确性。
内容的提问来源于stack exchange,提问作者maya
相关产品推荐
相关产品推荐

