【发布时间】:2015-03-27 19:50:36
【问题描述】:
要构造一组向量,我需要取集合 C[1]..C[d] 的笛卡尔积,
D := {x : x[i] ϵ C[i], i = 1..d}
例子:如果*C[1]=(5,6,7)';*C[2]=(3,5,6)';*C[3]=(1,3,5)',那么D的一些元素是(5,3,1), (5,3,3) ...
我想知道:一般来说,在 Mata 中获取笛卡尔积的最佳方法是什么?我发现了 d=3 的笨拙方法,如下图所示。
详细示例。此代码应说明我尝试过的内容和所需的输出。 mm_expand 函数来自ssc install moremata。
mata
// prep
lo = (5,3,1)'
hi = (7,6,5)'
all = uniqrows((lo\hi))
n_cols = length(lo)
n_vals = length(all)
c_list = J( 1,n_cols,NULL )
c_lens = J( 1,n_cols,0 )
for (i=1;i<=n_cols;i++){
c_list[i] = &(select( all,all :>= lo[i] :& all :<= hi[i] ))
c_lens[i] = length(*c_list[i])
}
// question: How should I take this Cartesian product?
grid_box =
mm_expand(*c_list[1],c_lens[2]*c_lens[3],0,1),
mm_expand(mm_expand(*c_list[2],c_lens[1],0,1),c_lens[3],0,0),
mm_expand(*c_list[3],c_lens[1]*c_lens[2],0,0)
// (just fyi) my next step
is_decr = ! rowsum( grid_box[,1..(n_cols-1)]-grid_box[,2..n_cols] :< 0 )
select(grid_box,is_decr)
end
代码的符号和“prep”部分与my application相关。
【问题讨论】:
标签: set stata cartesian-product