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

时间:2015-08-20 17:57:05

标签: matlab vector

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

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

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

提前谢谢!

2 个答案:

答案 0 :(得分: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) = i i = 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中的所有唯一值并将它们存储在A中,创建一个单元格数组,其中包含与唯一值一样多的单元格,然后为每个唯一值提取出来与i中的给定b值匹配的正确bool isPalin(char msg[]) { int len = strlen(msg); char backwards[400]=""; char letchar[2]=""; int i; for(i=len-1;i>=0;i--){ sprintf(letchar,"%c",msg[i]); strcat(backwards,letchar); strcpy(letchar,""); } if(strncmp(msg,backwards,(len/2))==0){return true;} else {return false;} } 值。

答案 1 :(得分:2)

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

首先定义您的数据:

$value=$_GET['value'];

然后

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});