我在MATLAB中有一个单元格,其中每个元素包含一个不同长度的向量
例如
C = {[1 2 3], [2 4 5 6], [1 2 3], [6 4], [7 6 4 3], [4 6], [6 4]}
Run Code Online (Sandbox Code Playgroud)
如您所见,某些向量是重复的,其他向量是唯一的.
我想计算每个向量发生的次数并返回计数,以便我可以在GUI中填充表,其中每行是唯一的组合,日期显示每个组合发生的次数.
例如
Count
"[1 2 3]" 2
"[6 4]" 2
"[2 4 5 6]" 1
"[7 6 4 3]" 1
"[4 6]" 1
Run Code Online (Sandbox Code Playgroud)
我应该说每个向量中数字的顺序很重要,即[6 4]与[4 6]不同.
有什么想法我怎么能相当有效地做到这一点?
感谢迄今为止评论过的人.正如@Divakar所指出的那样,我忘了提到矢量中的值可以超过一位数.即[46, 36 28].我的原始代码会将矢量连接[1 2 3 4]到1234然后使用hist进行计数.当然,当你达到一位数以上就会分崩离析,因为你可以分辨出[1, 2, 3, 4]和之间的区别[12, 34].
您可以将所有条目转换为char,然后转换为2D数字数组,最后用于unique(...'rows')获取唯一行的标签并使用它们来获取它们的计数.
C = {[46, 36 28], [2 4 5 6], [46, 36 28], [6 4], [7 6 4 3], [4 6], [6 4]} %// Input
char_array1 = char(C{:})-0; %// convert input cell array to a char array
[~,unqlabels,entry_labels] = unique(char_array1,'rows'); %// get unique rows
count = histc(entry_labels,1:max(entry_labels)); %// counts of each unique row
Run Code Online (Sandbox Code Playgroud)
为了以问题中提出的格式显示输出,您可以使用此 -
out = [C(unqlabels)' num2cell(count)];
Run Code Online (Sandbox Code Playgroud)
输出 -
out =
[1x4 double] [1]
[1x2 double] [1]
[1x2 double] [2]
[1x4 double] [1]
[1x3 double] [2]
Run Code Online (Sandbox Code Playgroud)
并显示唯一的行celldisp-
ans{1} =
2 4 5 6
ans{2} =
4 6
ans{3} =
6 4
ans{4} =
7 6 4 3
ans{5} =
46 36 28
Run Code Online (Sandbox Code Playgroud)
编辑:如果你有负数,你需要做更多的工作来设置char_array1如下所示,其余的代码保持不变 -
lens = cellfun(@numel,C);
mat1(max(lens),numel(lens))=0;
mat1(bsxfun(@ge,lens,[1:max(lens)]')) = horzcat(C{:});
char_array1 = mat1';
Run Code Online (Sandbox Code Playgroud)