Scilab中的笛卡尔积

时间:2014-11-30 18:30:55

标签: matlab vector set scilab cartesian-product

我一直在寻找建立特定套装的笛卡尔积的功能,就像这样:

Example: A = [-1 -3 -5]; B = [10 11]; C = [0 1]; 

X = SETPROD(A,B,C) 
X = 

  -5 10 0 
  -3 10 0 
  -1 10 0 
  -5 11 0 
  -3 11 0 
  -1 11 0 
  -5 10 1 
  -3 10 1 
  -1 10 1 
  -5 11 1 
  -3 11 1 
  -1 11 1

实际上我能够为Matlab http://www.mathworks.com/matlabcentral/fileexchange/5898-setprod找到这样的功能 但不幸的是,这在Scilab中不起作用。

我知道这个问题很简单,但这是我在Scilab做的第一个程序。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您知道产品中的因素数量(例如,您将乘以3组),那么ndgrid会为您完成所有事情:

A = [-1 -3 -5]
B = [10 11]
C = [0 1]
[X, Y, Z] = ndgrid(A, B, C)
P = [X(:) Y(:) Z(:)]

其中矩阵P以您想要的形式列出产品的元素。


对于可变数量的因子,MATLAB approach似乎不起作用(或者我无法弄清楚如何将可变数量的参数传递给Scilab中的ndgrid)。相反,我抬起source of ndgrid并遵循其逻辑。

 // input is a cell array of row vectors

c = cell()
n = // number of vectors
for k=1:n
  c(k).entries = // your k-th vector
end

 // Here the code that receives the cell array c and finds the product

n = length(c)
dim = zeros(1,n)

for k=1:n
  dim(k) = length(c(k).entries)
end

P = zeros(prod(dim),n)

for k=1:n
  f1 = ones(1,prod(dim(k+1:$)))
  f2 = ones(1,prod(dim(1:k-1)))
  P(:,k) = (f1.*.(c(k).entries).*.f2)'
end

同样,P具有产品的元素,每行一个。请注意.*.不是拼写错误:它是Kronecker矢量的产物。例如,

[1 2 3].*.[1 1] = [1 1 2 2 3 3]
[1 1].*.[1 2 3] = [1 2 3 1 2 3] 

具有1向量f1f2的Kronecker产品可确保以正确的模式重复条目以生成所有产品元素。交换f1f2会导致元素的排序不同,这可能更符合您的喜好。