Matlab中的重复组合计数 我们考虑以下情况,例如细胞矩阵A: A: A(:,1)A(:,2) A(:,3) A(:,4) A(:,5) 'CM' '00118''000151' '19970303''19970729' 'RO' '01356''043605' '19970212''19970401' 'CM' '01464''000151' '19970121''19970218' 'RO' '01356''043605' '19970119''19970313' 'CM' '00118''043605' '19970114''19970219' 'CM' '00118''000151' '19970523''19970728'
在前三列中,字符串和值都被合并并沿矩阵重复 我想创建一个新专栏Matlab中的重复组合计数 我们考虑以下情况,例如细胞矩阵A: A: A(:,1)A(:,2) A(:,3) A(:,4) A(:,5) 'CM' '00118''000151' '19970303''19970729' 'RO' '01356''043605' '19970212''19970401' 'CM' '01464''000151' '19970121''19970218' 'RO' '01356''043605' '19970119''19970313' 'CM' '00118''043605' '19970114''19970219' 'CM' '00118''000151' '19970523''19970728',matlab,match,cell,Matlab,Match,Cell,在前三列中,字符串和值都被合并并沿矩阵重复 我想创建一个新专栏 REP = num2cell(REP); A(:,end+1) = REP; 这将对应于每个匹配A(:,1)的A(:,3)的重复次数。例如,本例的输出为: Output for A: A(:,1) A(:,2) A(:,3) A(:,4) A(:,5) REP 'CM' '00118''000151' '19970303''19970729''3' 'RO' '01356''043605' '19
REP = num2cell(REP);
A(:,end+1) = REP;
这将对应于每个匹配A(:,1)的A(:,3)的重复次数。例如,本例的输出为:
Output for A:
A(:,1) A(:,2) A(:,3) A(:,4) A(:,5) REP
'CM' '00118''000151' '19970303''19970729''3'
'RO' '01356''043605' '19970212''19970401''2'
'CM' '01464''000151' '19970121''19970218''3'
'RO' '01356''043605' '19970119''19970313''2'
'CM' '00118''043605' '19970114''19970219''1'
'CM' '00118''000151' '19970523''19970728''3'
如果您尝试以下方法:
clear all
clc
A = cell(6,6);
% I replicate only the relevant part of your cell array.
A(:,1) = {'CM' 'RO' 'CM' 'RO' 'CM' 'CM'};
A(:,3) = {'000151' '043605' '000151' '043605' '043605' '000151'};
% Concatenate strings to easily compare them afterwards.
ConcatString = cell(size(A,1),1);
for i = 1:size(A,1)
ConcatString{i} = strcat(A{i,1},num2str(A{i,3}));
end
REP = zeros(size(A,1),1);
for i = 1:size(A,1)
Match = strcmp(ConcatString{i}, ConcatString) % Get logical array, '1' represents match.
NumRep = size(find(Match ==1),1) % Number of repetitions
REP(Match ==1) = NumRep % Enter # of repetitions in REP
end
A(:,6) = num2cell(REP);
disp(A)
这就给了我:
'CM' [] '000151' [] [] [3]
'RO' [] '043605' [] [] [2]
'CM' [] '000151' [] [] [3]
'RO' [] '043605' [] [] [2]
'CM' [] '043605' [] [] [1]
'CM' [] '000151' [] [] [3]
这有点粗糙,但我想你可以用你的数据来填补空白 对于两列中的每一列,使用将字符串转换为唯一的数字标签。然后使用(也可以使用)计算每个标签组合的重复次数: 在您的示例中,假设输入为
A = {'CM' '00118' '000151' '19970303' '19970729'
'RO' '01356' '043605' '19970212' '19970401'
'CM' '01464' '000151' '19970121' '19970218'
'RO' '01356' '043605' '19970119' '19970313'
'CM' '00118' '043605' '19970114' '19970219'
'CM' '00118' '000151' '19970523' '19970728'};
代码生成
REP =
3
2
3
2
1
3
A =
'CM' '00118' '000151' '19970303' '19970729' '3'
'RO' '01356' '043605' '19970212' '19970401' '2'
'CM' '01464' '000151' '19970121' '19970218' '3'
'RO' '01356' '043605' '19970119' '19970313' '2'
'CM' '00118' '043605' '19970114' '19970219' '1'
'CM' '00118' '000151' '19970523' '19970728' '3'
谢谢你的帮助!代码的第二行给出了以下错误:
使用cell/unique时出错(第86行)输入A必须是字符串的单元格数组。
我猜这是因为A(:,3)是一个只包含数字的列?@user3557054我不确定A的单元格中有哪些数据。从你的帖子看来,它们都是字符串(即使这些字符串描述了数字),这就是我的假设;请参见编辑的中的示例answer@user3557054如果第3列是数字,而不是字符串,请使用[~,~,uuu3]=unique([A{:,3}.]);%//获取独特的标签
感谢您的帮助。代码工作正常,但我仍然必须检查它是否正是我所寻找的。我会让你知道的!谢谢:)
REP =
3
2
3
2
1
3
A =
'CM' '00118' '000151' '19970303' '19970729' '3'
'RO' '01356' '043605' '19970212' '19970401' '2'
'CM' '01464' '000151' '19970121' '19970218' '3'
'RO' '01356' '043605' '19970119' '19970313' '2'
'CM' '00118' '043605' '19970114' '19970219' '1'
'CM' '00118' '000151' '19970523' '19970728' '3'