首页 文章

如何在matlab中基于另一个向量将向量划分为子向量

提问于
浏览
0

我有一个向量,让它是 b=[1 2 2 3 4 1 2 1 4...] 和另一个向量 A(n) ,我想用以下方式在向量中划分:

A(1)A(6) 以及 A(8) 都属于向量1,称为Av1 A(2)A(6)A(8) 都属于向量2,称为Av2等...

向量b可以包含1:n的数字,这意味着我无法为每个Av单独编写代码 . 基本上每个b(i)对应于每个A(i)并告诉我它将属于哪个子向量 . 任何人都有任何想法?

先感谢您!

2 回答

  • 2

    首先,我不建议你为每个数组创建单独的变量......这将简单地笨拙 . 如果您在 b 中有100个不同的值,该怎么办?我建议您使用 cell 数组,而每个单元格都会提取相应的 A 值 .

    arrayfununique的简单调用就足够了:

    out = arrayfun(@(x) A(b == x), unique(b), 'uni', 0);
    

    这将是 b 中的每个唯一值,我们提取 A 中匹配的相应位置并将它们放入单元格数组中 . 给出你的小例子:

    b=[1 2 2 3 4 1 2 1 4];
    

    ....和 A 简单地说:

    A = 1:numel(b);
    

    我故意声明这样的 A ,所以它匹配 A 的实际相应位置,你正在提取......所以 A(i) = ii = 1 ,最多可达到 b 的值 .

    我们得到这个:

    >> celldisp(out)
    
    out{1} =
    
         1     6     8
    
    
    
    out{2} =
    
         2     3     7
    
    
    
    out{3} =
    
         4
    
    
    
    out{4} =
    
         5     9
    

    您可以看到,对于每个单元格,我们在 A 中提取出与 b 中找到的每个唯一ID相对应的正确值 .


    如果你不熟悉 arrayfun ,它基本上对输入数组的每个值执行一个函数 . 在我们的例子中,我想要做的是将数组指定为 b 中的所有唯一值 . 对于 b 中的每个唯一值,我看看哪里可以找到匹配的这些位置,然后使用逻辑索引来提取 A 中的相应值 .

    arrayfun 基本上是一个 for 循环,所以等效的 for 循环代码看起来像这样:

    unq = unique(b);
    out = cell(1,numel(unq));
    for idx = 1:numel(unq)
        x = unq(idx);
        out{idx} = A(b == x);
    end
    

    我们首先找到 b 中的所有唯一值并将它们存储在 unq 中,创建一个单元格数组,其中包含与唯一值一样多的单元格,然后对于每个唯一值,提取出与给定 i 值匹配的正确 A 值 . b .

  • 2

    @rayryeng says,不要创建单独的变量;请改用cell array . 您可以使用accumarray执行此操作,如下所示:

    首先定义您的数据:

    b = [ 1 2 2 3 4 1 2 1 4 ];
    A = 1:numel(b); %// for example
    

    然后

    C = accumarray(b(:), A(:), [], @(x) {x});
    

    >> C
    C = 
        [3x1 double]
        [3x1 double]
        [         4]
        [2x1 double]
    >> celldisp(C)
    C{1} =
         6
         8
         1
    C{2} =
         7
         3
         2
        C{3} =
         4
    C{4} =
         5
         9
    

    如果您想保留原始订单:

    [bs, ind] = sort(b);
    As = A(ind);
    C = accumarray(bs(:), As(:), [], @(x) {x});
    

    >> C
    C = 
        [3x1 double]
        [3x1 double]
        [         4]
        [2x1 double]
    >> celldisp(C)
    C{1} =
         1
         6
         8
    C{2} =
         2
         3
         7
    C{3} =
         4
    C{4} =
         5
         9
    

相关问题