2014-03-13 31 views
1

我有字的数组:提取累积的n-gram Matlab的

x=['ae' ; 'be' ; 'ce' ; 'de' ; 'ee' ; 'fe'] 

我想提取字符集。因此,假设每一组有N = 2分的话,我怎么能去获得看起来像这样

'ae' 'be' 
'be' 'ce' 
'ce' 'de' 
'de' 'ee' 
'ee' 'fe' 

所以返回值,如果N = 2,我回去其中每行都包含对当前和以前的矩阵字符。如果N = 3,我会为每一行取回当前和前两个字符。如果可能,我想避免循环。

任何想法?

回答

1

可以使用Circulant Matrix Maltlab提供,截断它根据需要,并用它作为一个指标向量:

x = {'ae' ; 'be' ; 'ce' ; 'de' ; 'ee' ; 'fe'} 
N = 3; 

n = numel(x); 

A = gallery('circul',n:-1:1) 
B = fliplr(A(1:n-N+1,n-N+1:end)) 

result = x(B) 

或更短一点:

A = fliplr(gallery('circul',n:-1:1)) 
result = x(A(1:n-N+1,1:n-N)) 

或使用hankel另一种选择 - 矩阵:

A = hankel(1:n,1:N) 
result = x(A(1:n-N+1,:)) 

给出:

result = 

    'ae' 'be' 'ce' 
    'be' 'ce' 'de' 
    'ce' 'de' 'ee' 
    'de' 'ee' 'fe' 
+0

抱歉花这么长时间,我完全忘了。 – user1234440