如何在Matlab中的二维矩阵的每一行中找到唯一的单词

时间:2014-07-05 00:32:36

标签: matlab matrix row unique words

我有一个二维巨大的矩阵(A)。该矩阵的每个单元格都是空的或包含单词。我想分别在这个矩阵的每一行中找到唯一的单词并将它们存储在另一个二维矩阵(B)中,这样B的第K行包含A中第K行的唯一元素。我试过这种方式但它说输入必须是单元格数组:

 % engine

 B = sort(A,2) ;

 d = [true(1,size(B,2)) ; diff(B)>0] ;

 B = mat2cell(B(d).',1,sum(d));

 % check if B{K} contains the unique elements of the Kth row of A

 for i=1:size(A,1),

     tf(i) = isequal(B{i},unique(A(i,:))) ;
 end

 all(tf)

感谢您帮助解决此错误。

1 个答案:

答案 0 :(得分:0)

你几乎是正确的。如果我正确理解了您的问题,您希望迭代矩阵的每一行,找到唯一的单词,并在包含这些单词的输出单元格数组中创建一个新的单元格行。以下是使用3 x 5单元格元素矩阵的示例:

A = 'Hi hi hi how are you my my name is Ray Ray Ray StackOverflow StackOverflow';
Acell = reshape(strsplit(A, ' '), 3, 5).'; % // Use for MATLAB R2013a and up
%//Acell = reshape(regexp(A, ' ', 'split'), 3, 5).'; %// Use for MATLAB R2012b and below

以下是Acell的样子:

Acell = 

'Hi'     'hi'               'hi'           
'how'    'are'              'you'          
'my'     'my'               'name'         
'is'     'Ray'              'Ray'          
'Ray'    'StackOverflow'    'StackOverflow'

现在,让我们在单元格数组中插入一些空白字符串来模仿你的情况

Acell{1,1} = '';
Acell{4,1} = '';

因此:

Acell = 

''       'hi'               'hi'           
'how'    'are'              'you'          
'my'     'my'               'name'         
''       'Ray'              'Ray'          
'Ray'    'StackOverflow'    'StackOverflow'

现在,让我们将矩阵B初始化为一个将存储此输出的单元格数组:

B = cell(size(Acell), 1);

这将包含与Acell一样多的行。但是,会发生的是B的每一行不均匀。因此,我们能够完成您想要的任务的唯一方法是B的每个元素也将是单元格数组。 MATLAB不支持创建每行具有不相等列的矩阵。现在,我们可以简单地遍历A的每一行,运行unique,然后将其分配给B的每一行:

for idx = 1 : size(Acell, 1)
    B{idx} = unique(Acell(idx,:));
end

现在让我们看看B

B = 

{1x2 cell}
{1x3 cell}
{1x2 cell}
{1x2 cell}
{1x2 cell}

让我们自己看看每个cell

for idx = 1 : numel(B)
    disp(B{idx});
end

我们得到:

''    'hi'

'are'    'how'    'you'

'my'    'name'

''    'Ray'

'Ray'    'StackOverflow'

您会注意到这些字词也按字母顺序排序。这就是unique命令事情的方式。另请注意,unique不区分大写和小写字母。因此,Hihi将被视为不同的字词。如果这不是您想要的行为,并且您希望过滤掉案例无关紧要的单词,请在执行任何处理之前使用lower函数将所有字母转换为小写。您可以使用cellfun

将所有字符串转换为较低的字符串
Alower = cellfun(@lower, A, 'UniformOutput', false);

如果您将BAcell进行比较,则会为您提供每行的唯一字词。