Если вы знаете, количество факторов в продукте (например, вы будете умножая 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, кажется, не работает (или я не мог понять, как передать переменное количество аргументов ndgrid
в Scilab). Вместо этого я искал 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 имеет элементы продукта, по одному в каждом ряду. Обратите внимание, что .*.
не является опечаткой: это произведение векторов Кронекера. Например,
[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
гарантирует, что записи повторяются в правильном шаблоне, чтобы производить все элементы продукта. Обмен f1
и f2
приводит к другому упорядочению элементов, что может быть больше по своему вкусу.
Это сообщение MATLAB может вам помочь. Вы можете перенести его с помощью SciLab: http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors – rayryeng
Scilab имеет 'ndgrid', поэтому он должен работать. – David