我一直在寻找建立特定套装的笛卡尔积的功能,就像这样:
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做的第一个程序。谢谢!
答案 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向量f1
和f2
的Kronecker产品可确保以正确的模式重复条目以生成所有产品元素。交换f1
和f2
会导致元素的排序不同,这可能更符合您的喜好。