Декартово произведение в MATLAB
Вот упрощенная версия проблемы, которую я имею. Предположим, что у меня есть вектор
p = [1 5 10]
и еще один
q = [75.85.95].
И я хочу придумать следующую матрицу:
res = [1,.75; 1,.85; 1,.95; 5,.75; 5,.85; 5,.95; 10,.75; 10,.85; 10,.95].
Это также известно как декартово произведение.
Как я могу это сделать?
Большое спасибо
Ответы
Ответ 1
Здесь один из способов:
[X,Y] = meshgrid(p,q);
result = [X(:) Y(:)];
Вывод:
result =
1.0000 0.7500
1.0000 0.8500
1.0000 0.9500
5.0000 0.7500
5.0000 0.8500
5.0000 0.9500
10.0000 0.7500
10.0000 0.8500
10.0000 0.9500
Ответ 2
Аналогичный подход, подобный описанному @nibot, можно найти в центральном обмене файлами matlab.
Он обобщает решение на любое количество входных множеств. Это будет упрощенная версия кода:
function C = cartesian(varargin)
args = varargin;
n = nargin;
[F{1:n}] = ndgrid(args{:});
for i=n:-1:1
G(:,i) = F{i}(:);
end
C = unique(G , 'rows');
end
Например:
cartesian(['c','d','e'],[1,2],[50,70])
ans =
99 1 50
99 1 70
99 2 50
99 2 70
100 1 50
100 1 70
100 2 50
100 2 70
101 1 50
101 1 70
101 2 50
101 2 70