OpenMDAO组件输出能否为数组/矩阵?输出大小相关疑问
OpenMDAO数组/矩阵类型输出参数配置方法
你遇到的ValueError: cannot reshape array of size 36 into shape (1,)报错,核心原因是OpenMDAO的变量默认是标量(shape为(1,)),如果没有显式指定输出的形状,系统会按标量校验赋值的内容,你传入6×6共36个元素的矩阵自然会触发形状不匹配错误。
只要在组件的setup方法中定义输出变量时,显式指定shape参数匹配你需要的矩阵维度即可,完全不需要拆分36个单独的元素传递,示例实现如下:
import numpy as np import openmdao.api as om class MatrixOutputComp(om.ExplicitComponent): def setup(self): # 显式声明输出M为6×6的矩阵 self.add_output('M', shape=(6, 6)) # 也可以直接传入初始值,系统会自动识别形状 # self.add_output('M', val=np.ones((6, 6))) def compute(self, inputs, outputs): # 直接赋值6×6矩阵即可,不会再报形状错误 M = np.ones([6, 6]) outputs['M'] = M # 测试验证 if __name__ == "__main__": prob = om.Problem() prob.model.add_subsystem('matrix_comp', MatrixOutputComp(), promotes=['*']) prob.setup() prob.run_model() # 打印输出验证 print(prob.get_val('M'))
额外说明:
- 该方法对输入变量同样生效:如果需要传入数组/矩阵类型的输入参数,在
add_input时也显式指定对应shape即可 - 支持任意维度的数组:不管是一维列表、二维矩阵还是更高维度的张量,只要
shape参数和实际赋值的维度匹配即可正常使用
内容的提问来源于stack exchange,提问作者Kasia
相关产品推荐
相关产品推荐

