2012-03-23 120 views
13

這裏是我有的問題的簡化版本。假設我有一個矢量MATLAB中的笛卡爾乘積

P = [1 5 10]

和另一個

Q = [75 0.85 0.95]。

並且我想要想出以下矩陣:

RES = [1,0.75; 1,0.85; 1,.95; 5,.75; 5,.85; 5,.95; 10,.75; 10,.85; 10,.95]。

這也被稱爲笛卡兒積。 我該怎麼做?

非常感謝

+0

其實,我發現http://www.mathworks.com/matlabcentral/fileexchange/5898這件事情不正是我想要的是! – emper 2012-03-23 04:54:03

+6

您應該將其作爲答案並接受您自己的答案來解決問題。 – learnvst 2012-03-23 05:48:27

+0

相似的問題:[Matlab - 生成一些向量的元素的所有可能的組合](http://stackoverflow.com/q/4165859/97160) – Amro 2012-07-26 01:39:29

回答

38

這裏有一種方法:

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

雖然這確實是笛卡爾乘積,但它不是OP要求的。這需要一個「結果=總和(結果,2)」的附加步驟來限定。 – jpjacobs 2012-03-23 10:09:30

+3

我不認爲這是真的。如果仔細觀察,OP問題中的結果矩陣似乎是2×9,而不是1×9。第一行是「1,0.75」(注意「1.75」中的空格),而不是1.75。鏈接的FileExchange腳本進一步證實了這一點,他說這確實是正確的。我同意這令人困惑 - 我不得不眯眼看看發生了什麼事情! – nibot 2012-03-23 10:14:31

+0

你完全正確的那個。爲了清楚起見,我會糾正他的帖子。 – jpjacobs 2012-03-23 10:18:17

1

類似的方法,通過@nibot描述的可matlab central file-exchange找到。

它將解決方案概括爲任何數量的輸入集。這將是代碼的簡化版本:

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