gpt4 book ai didi

matlab - 生成具有向量集/对的组合矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 20:34:45 27 4
gpt4 key购买 nike

我想从一组向量中找到元素的所有组合。我发现以下 answer效果很好。但是,我的一些向量是配对在一起的。例如,如果我有向量 [15, 20][60, 70],我想得到组合 [15, 60][20, 70](因为 15 不能与 70 组合)。

因此,对于以下向量:

vectors = {[1 2], [3 6 9], [10 20 30]} % [3 6 9] and [10 20 30] are paired

,应该给

combs = [ 1     3    10
1 6 20
1 9 30
2 3 10
2 6 20
2 9 30 ]

对于这个简单的示例,我可以使用链接中的组合代码,方法是使用 vectors = {[1 2], [3 6 9]},并为生成第三列:

combs = [combs, repmat([10 20 30], 1, size(combs, 1)/size([10 20 30], 2))'];

然而,我的案例并没有那么简单。例如,我想要一个适用于向量的代码:

vectors = {[1 2], [3 6 9], [10 20 30], [3 4 5], [55 66 77], [555 666 777], [101 201]} 
% [3 6 9] and [10 20 30] are a pair.
% [55 66 77] and [555 666 777] are a pair.

最佳答案

您首先需要定义哪些向量是“链接”的。使用您的示例,

vectors = {[1 2] [3 6 9] [10 20 30] [3 4 5] [55 66 77] [555 666 777] [101 201]};
linked = [1 2 2 3 4 4 5]; %// equal numbers mean those vectors are linked

然后您可以对引用答案稍作修改:

  1. 将每个向量缩减为值 1,2,3,... 的等效向量,我们称其为“int-vector”。

  2. 从每个链接的向量集中仅考虑一个“代表性”整数向量生成组合。

  3. 为剩余的 int 向量(链接到它们的代表)填充复制的值(列)。这就是我们使用整数向量而不是向量的原因:每个非代表只是其代表的副本。

  4. 使用索引将整数向量转换为实际向量。

代码:

intVectors = cellfun(@(x) 1:numel(x), vectors, 'uniformoutput', 0); %// transform
%// each vector into integers 1, 2, 3,...
[~, u, v] = unique(linked);
uIntVectors = intVectors(u); %// choose one int-vector as representative of each
%// linked set
m = numel(vectors); %// number of vectors
n = numel(uIntVectors); %// number of representatives (int-vectors)
combs = cell(1,n);
[combs{end:-1:1}] = ndgrid(uIntVectors{end:-1:1});
combs = combs(:,v); %// include non-representatives (linked int-vectors)
combs = cat(m+1, combs{:});
combs = reshape(combs,[],m); %// combinations of representatives (int-vectors)
num = max(combs, [], 1); %// number of elements of each vector
vectorsCat = [vectors{:}]; %// concatenate all vectors
cnum = cumsum(num(1:end-1));
combs(:,2:end) = bsxfun(@plus, combs(:,2:end), cnum); %// transform integers
%// so that they can index vectorsCat
combs = vectorsCat(combs); %// do the indexing to get final result

为了简洁起见,让我们稍微简化一下您的示例:

vectors = {[1 2], [3 6 9], [10 20 30], [3 4 5]};
linked = [1 2 2 3];

产生

1     3    10     3
1 3 10 4
1 3 10 5
1 6 20 3
1 6 20 4
1 6 20 5
1 9 30 3
1 9 30 4
1 9 30 5
2 3 10 3
2 3 10 4
2 3 10 5
2 6 20 3
2 6 20 4
2 6 20 5
2 9 30 3
2 9 30 4
2 9 30 5

关于matlab - 生成具有向量集/对的组合矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com