我有三个相同大小的矢量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]
答案 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 定义为:
您可以使用它来获取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,:));