【问题标题】:How to find unique words in each row of a two dimension matrix in Matlab如何在Matlab中找到二维矩阵的每一行中的唯一词
【发布时间】:2014-08-26 05:52:33
【问题描述】:

我有一个二维大矩阵 (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)A 是什么?这是一个单元格数组吗? (2) 如果A 是一个元胞数组,那么每个元素都是一个单词吗? (3) 这个元胞数组的每一行都是一个句子吗?
  • 当然,这里是澄清:1)A是我作为输入的二维矩阵。我说矩阵的每个单元格要么是空的,要么包含一个单词,而不是每一行。 2)每个单元格将包含一个单词,如果它不为空。 3)不,矩阵的每一行都不是一个句子。
  • 好的,那么A 是一个二维单元矩阵吗? 2D 矩阵可以意味着任何东西......双打,结构,单元格等。另外,你能发布一个你拥有的一些数据的例子,所以当我回答你的问题时,你可以看到我是否正确回答了你的问题?
  • 没关系,我有一个答案给你。给我一点时间。

标签: matlab matrix row unique words


【解决方案1】:

你几乎说对了。如果我正确理解您的问题,您希望遍历矩阵的每一行,找到唯一的单词,并在包含这些单词的输出单元格数组中创建新的单元格行。下面是一个使用 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 的每个元素也将是一个 cell 数组。 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 进行比较,则会得到每行唯一的单词。

【讨论】:

  • @user3439050 不客气。如果此答案对您有所帮助,请考虑接受。单击我的帖子顶部左侧的复选标记图标,在向上和向下投票按钮下方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2017-10-10
  • 2014-02-05
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多