找到2个向量的所有可能的内射映射

时间:2013-10-11 10:31:07

标签: matlab

我有2个向量:

A = [1 2]
B = [3 4 5]

我想找到A和B之间所有不同的映射,这些映射都是单射的,即结果应该是这样的:

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

有没有人建议如何在MATLAB中执行此操作?谢谢!

1 个答案:

答案 0 :(得分:1)

您基本上需要计算范围向量B的所有排列

perms(B).'

这将为您提供所需结果的第二列。第一列只是您的域向量转置,A.'


要存储映射,您可以保留 n 每个第二列的第一行,其中 n A的长度。由于可能会重复,因此请使用unique;

删除它们
aux = perms(B);
mappings = unique(aux(:,1:length(A)),'rows').';

因此,mappings(i,j)A通过 j -th映射的 i -th元素的图像。


要以您发布的格式显示结果,您只需要使用reshape一点来交换域和映射范围:

>> reshape([repmat(A.',1,size(mappings,2)); mappings],length(A),[])

ans =
     1     5     1     5     1     4     1     4     1     3     1     3
     2     4     2     3     2     5     2     3     2     4     2     5