2011-09-16 25 views
43

不止一次我現在需要生成MATLAB兩個向量的所有可能對我的其中佔用的代碼,即如何使用矢量化代碼在MATLAB中從兩個矢量生成所有對?

vec1 = 1:4; 
vec2 = 1:3; 
i = 0; 
pairs = zeros([4*3 2]); 
for val1 = vec1 
    for val2 = vec2 
     i = i + 1; 
     pairs(i,1) = val1; 
     pairs(i,2) = val2; 
    end 
end 

生成一個公平的幾行循環做更多...

1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 
4 1 
4 2 
4 3 

必須有更好的方法來做到這一點,這是更多的MATLAB'esque?

n.b. nchoosek不會做我需要的反轉對(即2 1以及1 2),我不能反轉並追加nchoosek輸出,因爲對稱對將包含兩次。

+2

可能重複 - 生成一些載體元素的所有可能組合](http://stackoverflow.com/questions/4165859/matlab-generate-all-possible-combinations-of-the-elements-of-some-vectors) – Amro

回答

86

嘗試

[p,q] = meshgrid(vec1, vec2); 
pairs = [p(:) q(:)]; 

MESHGRID documentation。雖然這不完全是這個功能的用處,但是如果你眯起來看起來有趣,你所要求的正是它的功能。

+1

太棒了。我知道'meshgrid'和二維矢量序列化,但從來沒有考慮過這樣使用它們。 – Brendan

3

您可以通過使用repmat來複制矩陣,然後使用reshape將結果轉換爲列向量。

a = 1:4; 
b = 1:3; 
c = reshape(repmat(a, numel(b), 1), numel(a) * numel(b), 1); 
d = repmat(b(:), length(a), 1); 
e = [c d] 

e = 

    1  1 
    1  2 
    1  3 
    2  1 
    2  2 
    2  3 
    3  1 
    3  2 
    3  3 
    4  1 
    4  2 
    4  3 

當然,你可以擺脫上面例子中的所有中間變量。

3

收集另一種解決方案:

[idx2, idx1] = find(true(numel(vec2),numel(vec1))); 
pairs = [reshape(vec1(idx1), [], 1), reshape(vec2(idx2), [], 1)]; 
+0

+1:我刪除了我的解決方案,我更喜歡你的解決方案。我冒昧地改正它,以獲得'vec1'和'vec2'的組合。 –

+0

@EitanT:無需重塑。 'find'的索引總是應該是列矢量,以及'vec1(idx1)'等。 – yuk

+0

我認爲重塑是必須的。考慮到'idx1'是一個向量(如果行或列無關緊要),如果'vec1'是一個行向量,那麼'vec1(idx1)'也將是一個行向量。 'vec2'也是一樣。 –

11

您可以使用

a = 1:4; 
b = 1:3; 
result = combvec(a,b); 
result = result' 
+1

請注意,這需要神經網絡工具箱。對於那些擁有它的人來說,它似乎是最好的解決方案。 –

+0

像這個比接受的解決方案更好,因爲它推廣到多個向量。 – neuronet

+1

@neuronet我知道一個遲到的回覆,但是值得一提的是,未來的訪問者知道這相對於大型向量可接受的解決方案來說非常慢。 – Wolfie

0

你要找的是cartesian product

cartprod是實現它的功能。您可以在線性代數軟件包中找到它,所以你需要做的:

>> pkg install -forge linear-algebra 
    >> pkg load linear-algebra 
    >> sortrows(cartprod(1:4,1:3))            
    ans =                       
     1 1                 
     1 2                 
     1 3                 
     2 1                 
     2 2                 
     2 3                 
     3 1                 
     3 2                 
     3 3                 
     4 1                 
     4 2                 
     4 3  
+0

[MATLAB文件交換](http://www.mathworks.com/matlabcentral/fileexchange/5475-cartprod--cartesian-product-of-多套)。 – mikkola

1

這裏更MATLAB'esque的方式找到的組合。這個也可以很容易地擴展到超過2個矢量(以及非數字組合):

v1 = 1: 1: 3; 
v2 = 11: 11: 44; 
v3 = 111:111:555; 

dimensions = cellfun(@numel, {v1,v2,v3}); 

[i1,i2,i3] = ind2sub(dimensions, 1:prod(dimensions)); 

combinations = [v1(i1); v2(i2); v3(i3)]' 
1

您可以使用普通的舊矩陣運算,例如,在

x = [3,2,1]; 
y = [11,22,33,44,55]; 
v = [(ones(length(y),1) * x)(:), (ones(length(x), 1) * y)'(:)] 

編輯:這是八度的語法,MATLAB會是這樣的:

x = [3,2,1]; 
y = [11,22,33,44,55]; 
A = ones(length(y),1) * x; 
B = (ones(length(x), 1) * y)'; 
v = [A(:) B(:)] 

在這兩種情況下,結果將是[Matlab的

v = 
3 11 
3 22 
3 33 
3 44 
3 55 
2 11 
2 22 
2 33 
2 44 
2 55 
1 11 
1 22 
1 33 
1 44 
1 55 
+0

這不是有效的MATLAB語法。 – gnovice

+0

@gnovice謝謝,我的壞。我已經修復了這個語法。 – jihor