如何在GAMS中生成由年份集与季度集拼接而成的集合?
在GAMS中实现年份与季度集合元素的拼接生成新集合
需求说明
需要创建新集合T,其元素为年份集合TY元素与季度集合TQ元素的拼接结果,覆盖两者的所有笛卡尔积组合(例如2019Q1、2019Q2……2040Q4)。已知基础集合定义如下:
SET TY /2019*2040/; SET TQ /Q1*Q4/;
实现方法
方法1:简洁的集合直接定义(推荐)
利用GAMS的字符串拼接运算符//和集合遍历语法,直接基于笛卡尔积生成目标集合:
SET TY /2019*2040/; SET TQ /Q1*Q4/; * 生成关联原TY、TQ的二维集合 SET T(TY,TQ) / [y,q] : y.tl // q.tl /; * 若需生成独立的一维集合 SET T_flat / [y,q] : y.tl // q.tl /;
y.tl和q.tl分别获取集合元素的文本标签//是GAMS的字符串拼接操作符[y,q]表示遍历TY和TQ的所有组合,自动生成所有拼接后的元素
方法2:循环遍历生成(对应Stata的foreach逻辑)
如果更习惯循环写法,可以通过嵌套LOOP逐个添加元素:
SET TY /2019*2040/; SET TQ /Q1*Q4/; * 初始化空集合 SET T / /; * 嵌套循环遍历年份和季度,拼接后添加到集合T LOOP(TY(y), LOOP(TQ(q), T(y.tl // q.tl) = YES; ); ); * 可选:显示生成的集合结果 DISPLAY T;
补充说明
如果需要截取元素的前N个字符(例如年份元素不是4位的场景),可以使用SUBSTR函数:
* 示例:取年份前4位、季度前2位拼接 SET T / [y,q] : SUBSTR(y.tl,1,4) // SUBSTR(q.tl,1,2) /;
内容的提问来源于stack exchange,提问作者Daniela Gallo
相关产品推荐
相关产品推荐

