我有一个二维巨大的矩阵(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)
感谢您帮助解决此错误。
答案 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
不区分大写和小写字母。因此,Hi
和hi
将被视为不同的字词。如果这不是您想要的行为,并且您希望过滤掉案例无关紧要的单词,请在执行任何处理之前使用lower
函数将所有字母转换为小写。您可以使用cellfun
Alower = cellfun(@lower, A, 'UniformOutput', false);
如果您将B
与Acell
进行比较,则会为您提供每行的唯一字词。