初始化3D数组报错:非数组类型及范围不存在,如何导入14个矩阵?
解决GAMS中3D数组初始化报错问题
问题根源
- 导入数据维度不匹配:你当前SheetRead的范围
Sheet1!B2:CW337列数超出了nv=100的设定,且未明确声明导入数组的维度,导致GAMS无法识别其为数组类型。 - 错误使用
item函数:item用于访问集合元素,而非数组维度转换,直接用它处理二维导入数据会触发范围不存在的报错。
修复步骤
1. 修正数据文件(导入二维数组)
确保Excel中14个24×100的矩阵是纵向连续堆叠(每个矩阵占24行,14个共336行),然后修改数据导入代码,明确声明数组维度:
SheetConnection excel1("soc3d.xlsx"); // 声明二维数组:行数=14*24=336,列数=100 float array[1..336, 1..100]; // 修正列范围:B到CV对应100列(替换原CW) array from SheetRead(excel1,"Sheet1!B2:CV337");
2. 修正模型文件(二维转三维数组)
通过索引映射将导入的二维数组直接转换为三维数组,无需使用item函数:
int nb=14; int t=24; int nv=100; range nbus=1..nb; range tavail=1..t; range nport=1..nv; // 导入二维数组 float array[1..nb*t, 1..nv]=...; // 通过索引计算直接赋值三维数组 float soc[nbus][tavail][nport] = array[(nbus-1)*t + tavail][nport];
验证要点
- 检查Excel数据:确保14个矩阵无空行空列,连续排列在B2开始的区域。
- 核对维度:确认导入范围的行数是
14*24=336(第2行到第337行),列数是100(B到CV)。
内容的提问来源于stack exchange,提问作者Harip
相关产品推荐
相关产品推荐

