Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用向量集/向量对生成组合矩阵_Matlab - Fatal编程技术网

Matlab 使用向量集/向量对生成组合矩阵

Matlab 使用向量集/向量对生成组合矩阵,matlab,Matlab,我想从一组向量中找出所有元素的组合。我发现以下方法非常有效。然而,我的一些向量是成对的。例如,如果我有向量[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

我想从一组向量中找出所有元素的组合。我发现以下方法非常有效。然而,我的一些向量是成对的。例如,如果我有向量
[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,2,3,。。。我们称之为“int向量”

  • 从每个链接向量集生成只考虑一个“代表性”int向量的组合

  • 为其余整数向量(链接到其代表)填充复制的值(列)。这就是为什么我们使用int向量而不是向量:每个非代表性向量只是其代表性的一个副本

  • 使用索引将int向量转换为实际向量

  • 代码:

    为了简洁起见,让我们将您的示例简化为一小段:

    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
    

    那很好用!感谢您根据其他答案给出解决方案@事实上,我很容易概括出自己的答案:——)
    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