我想导入存储在 k excel 表中的三维参数 p(i,j,k) 的数据,但 GAMS 不允许我在循环中使用美元控制语句。有没有办法使用循环或其他流控制语句(如“for”或“while”)来做到这一点?
我需要做这样的事情,但这似乎是不可能的:
loop(k,
$call gdxxrw Data.xlsx par=temp rng=k!A1:Z20 rdim=1 cdim=1
$gdxin Data.gdx
$load temp
$gdxin
p(i,j,k)=temp(i,j);
);
我想导入存储在 k excel 表中的三维参数 p(i,j,k) 的数据,但 GAMS 不允许我在循环中使用美元控制语句。有没有办法使用循环或其他流控制语句(如“for”或“while”)来做到这一点?
我需要做这样的事情,但这似乎是不可能的:
loop(k,
$call gdxxrw Data.xlsx par=temp rng=k!A1:Z20 rdim=1 cdim=1
$gdxin Data.gdx
$load temp
$gdxin
p(i,j,k)=temp(i,j);
);
假设每张纸看起来像:
(唯一的区别是我在 sheet2 中使用 2,在 sheet3 中使用 3)。
要阅读此内容,请执行以下操作:
$set xls d:\tmp\test2.xlsx
$set gdx s.gdx
set
i /i1*i3/
j /j1*j5/
k 'sheet names' /Sheet1*Sheet3/
;
parameter
s(i,j) 'single sheet'
a(i,j,k) 'all data'
;
file f /task.txt/;
loop(k,
putclose f,'par=s rng=',k.tl:0,'!a1 rdim=1 cdim=1'/
execute 'gdxxrw i=%xls% o=%gdx% @task.txt trace=2';
execute_loaddc '%gdx%',s;
a(i,j,k) = s(i,j);
);
display a;
我的结果是:
---- 23 PARAMETER a all data
sheet1 sheet2 sheet3
i1.j1 1.000 2.000 3.000
i1.j2 1.000 2.000 3.000
i1.j3 1.000 2.000 3.000
i1.j4 1.000 2.000 3.000
i1.j5 1.000 2.000 3.000
i2.j1 1.000 2.000 3.000
i2.j2 1.000 2.000 3.000
i2.j3 1.000 2.000 3.000
i2.j4 1.000 2.000 3.000
i2.j5 1.000 2.000 3.000
i3.j1 1.000 2.000 3.000
i3.j2 1.000 2.000 3.000
i3.j3 1.000 2.000 3.000
i3.j4 1.000 2.000 3.000
i3.j5 1.000 2.000 3.000