在 2 个数组中生成所有可能的元素组合的有效方法

Efficient way to generate all possible combinations of elements in 2 arrays

我有一个数组 A=[1,2] 和 B=[5,6]
我想生成一个数组 C=[1*1,2*2,5*5,6*6,1*2,1*5,1*6,2*5,2*6,5*6]
这是所有可能的组合(ab 等于 ba,因此只有其中 1 个应该在结果 C 数组中)。

matlab 是否有我可以用来实现此目的的内置函数?
你能帮帮我吗?

可以在此处建议 bsxfun 的两种方法。

方法 #1

%// Form a concatenated array
AB = [A(:) ; B(:)]

%// Get pairwise multiplications between all elements
allvals = bsxfun(@times,AB,AB.') %//'

%// Discard the repeated ones for the final output
C = allvals(bsxfun(@le,[1:numel(AB)]',1:numel(AB)))

方法 #2

%// Form a concatenated array
AB = [A(:) ; B(:)]

%// Get "non-repeated" pairwise indices
[Y,X] = find(bsxfun(@le,[1:numel(AB)]',1:numel(AB))) %//'

%// Elementwise multiplications across all such pairs for final output
C = AB(X).*AB(Y)

第二种方法基于 ,比第一种方法占用更少的内存。

试试下面的代码:

%merge
AB = [A(:) ; B(:)]
%multiply to get all combinations
C=AB*AB'
%delete everything below the first diagonal
C=C(triu(true(numel(AB))));

另一种方法是将 pdist(来自 Statistics Toolbox)与匿名函数一起使用:

AB = [A(:); B(:)];
C = [AB.'.^2 pdist(AB, @(x,y) x*y)];

你使用两个向量的问题并没有增加多少。您只需要串联 x = [A(:); B(:)].

的每个 n choose 2 组合的乘积
prod(x(nchoosek(1:numel(x), 2)), 2)