2012-03-23 13 views
13

Đây là phiên bản đơn giản của vấn đề tôi gặp phải. Giả sử tôi có một vector [75. 0,85 0,95]sản phẩm Descartes trong MATLAB

p = [1 5 10]

và một số khác

q =.

Và tôi muốn đưa ra các ma trận sau:

res = [1, .75; 1, 0,85; 1, .95; 5, .75; 5, .85; 5, .95; 10, .75; 10, .85; 10, .95].

Điều này còn được gọi là Sản phẩm Descartes. Tôi có thể làm như thế nào?

Rất cám ơn

+0

Trên thực tế, tôi thấy rằng http://www.mathworks.com/matlabcentral/fileexchange/5898 điều này không chính xác những gì tôi muốn! – emper

+6

Bạn nên đặt câu trả lời đó và chấp nhận câu trả lời của riêng bạn để đóng câu hỏi. – learnvst

+0

Câu hỏi tương tự: [Matlab - Tạo tất cả các kết hợp có thể có của các phần tử của một số vectơ] (http://stackoverflow.com/q/4165859/97160) – Amro

Trả lời

38

Dưới đây là một cách:

[X,Y] = meshgrid(p,q); 
result = [X(:) Y(:)]; 

Đầu ra là:

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 
+0

Mặc dù đây thực sự là Sản phẩm Descartes, nhưng đó không phải là những gì mà OP yêu cầu. Nó sẽ cần một bước aditional của 'result = sum (result, 2)' để đủ điều kiện. – jpjacobs

+3

Tôi không nghĩ đó là sự thật. Nếu bạn nhìn kỹ, ma trận kết quả trong câu hỏi của OP có vẻ là 2 × 9, không phải là 1 × 9. Hàng đầu tiên là "1, 0,75" (lưu ý không gian trong "1 0,75"), không phải là 1,75. Điều này được xác nhận thêm bởi kịch bản FileExchange được liên kết mà anh ta nói chính xác là điều đúng. Tôi đồng ý rằng nó khó hiểu - tôi phải nheo mắt để xem chuyện gì đang xảy ra! – nibot

+0

Bạn hoàn toàn chính xác về điều đó. Tôi sẽ sửa bài viết của anh ấy cho rõ ràng. – jpjacobs

1

Một cách tiếp cận tương tự như một trong những mô tả bởi @nibot có thể được tìm thấy trong matlab central file-exchange.

Nó tổng hợp giải pháp cho bất kỳ số lượng bộ nhập liệu nào. Đây sẽ là một phiên bản đơn giản của các mã:

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 

Ví dụ:

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