2014-11-30 2 views
2

Я искал fucntion, строящей декартово произведение заданных множеств, так же, как это:декартово произведение множеств в Scilab

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. Спасибо!

+2

Это сообщение MATLAB может вам помочь. Вы можете перенести его с помощью SciLab: http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors – rayryeng

+0

Scilab имеет 'ndgrid', поэтому он должен работать. – David

ответ

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, кажется, не работает (или я не мог понять, как передать переменное количество аргументов 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 приводит к другому упорядочению элементов, что может быть больше по своему вкусу.

+0

Привет, в чем смысл $ в Scilab? – Royi

+0

Это как 'end' в Matlab. Индекс последнего элемента массива. Если x - массив, x ($) является его последним элементом. –

+0

Спасибо. Это мне очень помогло. – Royi