在MATLAB中存储矢量的唯一字符串/元素的索引

时间:2015-05-13 00:41:19

标签: matlab vector unique

我有三个相同大小的矢量A,B和C. A和B是数字量,而C是字符串的单元格数组。我想基于B和C的唯一值生成A的子向量。例如,让

A = [0.45 0.89 0.12 0.35 0.40 0.93 0.12 0.35 0.72 0.59];
B = [1 1 3 1 8 1 8 8 1 1];
C = [{'Tom'}, {'Mary'}, {'Dick'}, {'Harry'}, {'Dick'}, {'Tom'}, {'Tom'}, {'Mary'}, {'Tom'}, {'Mary'}];

所以,我首先尝试使用MATLAB的独特功能找到B和C的唯一值。结果如下:

unique(B)
ans =
 1    3     8
unique(C)
ans = 
'Dick'    'Harry'    'Mary'    'Tom'

现在,我想通过B和C中的唯一值来排列向量A.假设唯一(B)的第一个元素的唯一值的索引是 [row_b1,colb1],第二个元素索引是[row_b2,colb2],依此类推。然后,根据B中的唯一值,我想生成以下三个向量:

A_B1 = A(rowb1, colb1);
A_B2 = A(rowb2, colb2);
A_B3 = A(rowb3, colb3);

同样,基于C的唯一值,我想生成以下向量:

A_C1 = A(rowc1, colc1);
A_C2 = A(rowc2, colc2);
A_C3 = A(rowc3, colc3);
A_C4 = A(rowc4, colc4);

但是,我没有在unique命令中找到任何告诉我向量中唯一值的索引,即row_b1,col_b1,...等等。有人可以指出如何获取这些索引吗?任何帮助将不胜感激。

Edit1:我应该提一下我发布的一般情况。但在我的问题A,B和C是矩阵。我想如果我能为一个向量求解这个,那么它应该是矩阵的类似扩展。

Edit2:以下是我期待的答案:

A_B1 = [0.45 0.89 0.35 0.93 0.72 0.59]
A_B2 = [0.12]
A_B3 = [0.40 0.12 0.35]

A_C1 = [0.45 0.93 0.12 0.72]
A_C2 = [0.89 0.35 0.59]
A_C3 = [0.12 0.40]
A_C4 = [0.35]

2 个答案:

答案 0 :(得分:1)

让我们考虑相同的例子。

A = [0.45 0.89 0.12 0.35 0.40 0.93 0.12 0.35 0.72 0.59];
B = [1 1 3 1 8 1 8 8 1 1];
C = [{'Tom'}, {'Mary'}, {'Dick'}, {'Harry'}, {'Dick'}, {'Tom'}, {'Tom'}, {'Mary'}, {'Tom'}, {'Mary'}];

[uniqueB,indB,~]=unique(B);
[uniqueC,indC,~]=unique(C);
A_indB=A(indB); //This and the following line is what you want, I think.
A_indC=A(indC);

这在unique的文档中给出。

编辑:

我就是这样做的矩阵(数字和字符)。

首先生成一些矩阵。

A1=[A;A(randperm(length(A)));A(randperm(length(A)))];
B1=[B;B(randperm(length(B)));B(randperm(length(B)))];
C1=[C;C(randperm(length(C)));C(randperm(length(C)))];

现在,

indB=arrayfun(@(x) bsxfun(@eq,B1,x),unique(B1),'uni',0);
indC=arrayfun(@(x) strcmp(C1,x),unique(C1),'uni',0); % above line only works 
                                                     % for numeric arrays

并得到答案,

A_B1=A(indB{1,1});
A_B2=A(indB{2,1});
A_C1=A(indC{1,1});
A_C2=A(indC{2,1}); % and so on

答案 1 :(得分:1)

您可以使用 unique 功能的额外输出:

[ub ib jb]=unique(B);

ub ib jb 定义为:

  • ub = unique(B);
  • B(ib)= ub;
  • ub(jb)= B;

您可以使用它来获取A_B值:

A_B=A(ib);

同样的逻辑适用于C:

[cu ic jc]=unique(C);
A_C=A(ic);

由于A,B和C是相同大小的矢量。

修改

由于(rowb1,colb1),(rowb2,colb2)和(rowb3,colb3)只是注释中所解释的占位符,你真正想要的是每个唯一值出现的索引,并使用这些索引来获取你的A值。要获得每个唯一值出现的位置,您可以使用:

>> idxA_B=bsxfun(@eq,B,unique(B)')

ans =

     1     1     0     1     0     1     0     0     1     1
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     1     0     1     1     0     0

所以你的A_B值由下式给出:

A_B1=A(idxA_B(1,:));
A_B2=A(idxA_B(2,:));
A_B3=A(idxA_B(3,:));

同样的逻辑也适用于C.但正如@Parag S. Chandakkar指出的那样,@ eq不能用于字符串,所以你需要按照以下方式获取你的C索引:

aux=cellfun(@(x) strcmp(x,unique(C)'),C,'UniformOutput',false);
idxA_C = [aux{:}];
A_C1=A(idxA_C(1,:));
A_C2=A(idxA_C(2,:));
A_C3=A(idxA_C(3,:));
A_C4=A(idxA_C(4,:));