Чтобы построить набор векторов, мне нужно взять декартово произведение множеств 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)...
Я хотел бы знать: как вообще лучше всего использовать декартово произведение в Мате? Я нашел неуклюжий подход для 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
Обозначение и «подготовительная» часть кода связаны с мое приложение.