我有一个向量,让它为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)并告诉我它将属于哪个子向量。任何人都有任何想法?
提前谢谢!
答案 0 :(得分:2)
首先,我不建议你为每个数组创建单独的变量...这将简单地笨拙。如果b
中有100个不同的值,该怎么办?我建议您使用cell
数组,而不是每个单元格都会提取A
的相应值。
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});