我有一个数组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] <登记/>
这就是所有可能的组合( b等于b a,因此只有1个应该在结果C数组上)。
matlab是否有内置功能可用于实现此目的?
你能救我吗?
答案 0 :(得分:3)
这里可以提出两种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)
第二个基于Fastest solution to list all pairs of n integers
,并且比第一个方法的内存消耗更少。
答案 1 :(得分:2)
另一种方法是使用pdist
(来自统计工具箱)和匿名函数:
AB = [A(:); B(:)];
C = [AB.'.^2 pdist(AB, @(x,y) x*y)];
答案 2 :(得分:1)
请尝试以下代码:
%merge
AB = [A(:) ; B(:)]
%multiply to get all combinations
C=AB*AB'
%delete everything below the first diagonal
C=C(triu(true(numel(AB))));
答案 3 :(得分:0)
对于使用两个向量的问题,它并没有多大帮助。您只需要串联n choose 2
的每个x = [A(:); B(:)]
组合的产品。
prod(x(nchoosek(1:numel(x), 2)), 2)