我有一个向量,让它是 b=[1 2 2 3 4 1 2 1 4...] 和另一个向量 A(n) ,我想用以下方式在向量中划分:
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等...
A(1)
A(6)
A(8)
A(2)
向量b可以包含1:n的数字,这意味着我无法为每个Av单独编写代码 . 基本上每个b(i)对应于每个A(i)并告诉我它将属于哪个子向量 . 任何人都有任何想法?
先感谢您!
首先,我不建议你为每个数组创建单独的变量......这将简单地笨拙 . 如果您在 b 中有100个不同的值,该怎么办?我建议您使用 cell 数组,而每个单元格都会提取相应的 A 值 .
b
cell
A
对arrayfun和unique的简单调用就足够了:
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 的值 .
A(i) = i
i = 1
我们得到这个:
>> 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
arrayfun 基本上是一个 for 循环,所以等效的 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 .
unq
i
如@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
2 回答
首先,我不建议你为每个数组创建单独的变量......这将简单地笨拙 . 如果您在
b
中有100个不同的值,该怎么办?我建议您使用cell
数组,而每个单元格都会提取相应的A
值 .对arrayfun和unique的简单调用就足够了:
这将是
b
中的每个唯一值,我们提取A
中匹配的相应位置并将它们放入单元格数组中 . 给出你的小例子:....和
A
简单地说:我故意声明这样的
A
,所以它匹配A
的实际相应位置,你正在提取......所以A(i) = i
为i = 1
,最多可达到b
的值 .我们得到这个:
您可以看到,对于每个单元格,我们在
A
中提取出与b
中找到的每个唯一ID相对应的正确值 .如果你不熟悉
arrayfun
,它基本上对输入数组的每个值执行一个函数 . 在我们的例子中,我想要做的是将数组指定为b
中的所有唯一值 . 对于b
中的每个唯一值,我看看哪里可以找到匹配的这些位置,然后使用逻辑索引来提取A
中的相应值 .arrayfun
基本上是一个for
循环,所以等效的for
循环代码看起来像这样:我们首先找到
b
中的所有唯一值并将它们存储在unq
中,创建一个单元格数组,其中包含与唯一值一样多的单元格,然后对于每个唯一值,提取出与给定i
值匹配的正确A
值 .b
.如@rayryeng says,不要创建单独的变量;请改用cell array . 您可以使用accumarray执行此操作,如下所示:
首先定义您的数据:
然后
给
如果您想保留原始订单:
给