计算满载向量的单元格中的唯一行

Mar*_*ark 5 matlab cell-array

我在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].

Div*_*kar 6

您可以将所有条目转换为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)