使用scipy.optimize.fmin优化变换矩阵时遇维度不匹配错误
问题解决:scipy.optimize.fmin优化变换矩阵时的维度不匹配错误
问题原因
scipy.optimize.fmin会自动将多维参数数组扁平化,你的4x4猜测矩阵会被转换成1x16的一维数组,直接用这个数组和inputArray做矩阵乘法时,就会出现维度不匹配的错误。
修正步骤
- 在目标函数内部,先将扁平化的
guess重新reshape为4x4矩阵 - 用numpy向量化操作替代手动循环计算误差,提升效率
修正后的代码
import numpy as np from scipy import optimize rows, cols = 4, 4 guess = np.array([ [1, -1, 2, 0], [0, 2, 0, 0], [1, 0, 0, 1], [0, 1, 2, 0] ]) inputArray = np.array([ [2, 4, 6, 9], [2, 3, 1, 0], [7, 2, 6, 4], [1, 5, 2, 1] ]) goalArray = np.array([ [14, 5, 17, 17], [4, 6, 2, 0], [3, 9, 8, 10], [16, 7, 13, 8] ]) def objfunc(guess_flat, inputArray, goalArray): # 将扁平化的猜测值重新转为4x4矩阵 guess = guess_flat.reshape((rows, cols)) # 计算变换后的矩阵 model = guess @ inputArray # 计算所有元素的绝对误差之和(等价于原代码的平方根和,平方开根号即绝对值) error = np.sum(np.abs(goalArray - model)) return error # 验证目标函数正确性 print(objfunc(guess.flatten(), inputArray, goalArray)) # 输出0.0 # 传入扁平化的初始猜测进行优化 minimum = optimize.fmin(objfunc, guess.flatten(), args=(inputArray, goalArray)) # 将优化结果转回4x4矩阵 optimized_matrix = minimum.reshape((rows, cols)) print("优化后的变换矩阵:") print(optimized_matrix) print("最小误差:", objfunc(minimum, inputArray, goalArray))
关键说明
- 调用
fmin时传入guess.flatten(),确保和函数内部的维度处理逻辑对应 - 用numpy内置函数替代手动循环,代码更简洁且运行效率更高
- 优化完成后,需将扁平化的结果reshape回4x4矩阵,得到最终的变换矩阵
内容的提问来源于stack exchange,提问作者Reese Dawn
相关产品推荐
相关产品推荐

