为不同的子串分隔字符串

时间:2014-11-30 00:18:10

标签: matlab

假设我有一个字符串:akobabyd,如何在不使用for循环的情况下每3个字符创建一个子字符串数组?预期输出:ako kob oba bab aby byd

*这不是家庭作业,只是我需要考虑的解决方案。

由于

3 个答案:

答案 0 :(得分:3)

如果您可以使用内置函数,则可以使用hankel生成窗口序列,您可以在其中一次提取三个字符并将它们放入2D矩阵,其中每行是3个字符的序列。一般来说,假设您要查找len子字符串(在我们的示例中为len = 3),因此如果我们这样做:

len = 3;
ind = hankel(1:len, len:length(s))

我们会得到:

ind =

     1     2     3     4     5     6
     2     3     4     5     6     7
     3     4     5     6     7     8

您可以看到每个的索引都是三个元素长,并且在窗口之间有一个位置重叠。因此,我们只需使用这些索引来访问字符串中的相应字符并生成2D字符数组。但是,我们希望有字符串,因此我们需要转置此结果,然后访问我们的字符串。

因此:

s = 'akobabyd';
len = 3;
subseqs = s(hankel(1:len, len:length(s)).')

subseqs =

ako
kob
oba
bab
aby
byd

这可以推广到你想要的子串的长度。只需更改len

因此,要访问特定行idx,您只需执行以下操作:

t = subseqs(idx,:);

修改

你说你想在不使用hankel的情况下这样做。查看hankel来源,这就是我们得到的:

function H = hankel(c,r)

r = r(:);                       %-- force column structure
nr = length(r);

x = [ c; r((2:nr)') ];          %-- build vector of user data

cidx = (ones(class(c)):nc)';
ridx = zeros(class(r)):(nr-1);
H = cidx(:,ones(nr,1)) + ridx(ones(nc,1),:);  % Hankel subscripts
H(:) = x(H);                            % actual data

您可以看到它仅使用oneszeros以及class来确保我们获得的任何数据都是出来的。我们可以简化这一点,因为我们只知道数字数据(特别是double)即将出现。因此,Hankel脚本的简化版本以及提取所需的字符将是:

s = 'akobabyd'; %// Define string here

%// Hankel starts here
c = (1 : len).'; 
r = (len : length(s)).';
nr = length(r);
nc = length(c);

x = [ c; r((2:nr)') ];          %-- build vector of user data

cidx = (1:nc)';
ridx = 0:(nr-1);
H = cidx(:,ones(nr,1)) + ridx(ones(nc,1),:);  % Hankel subscripts
ind = x(H);                            % actual data
%// End Hankel script

%// Now get our data
subseqs = s(ind.');

答案 1 :(得分:2)

这个怎么样:

A = 'akobabyd';

C = arrayfun(@(ii) A(ii-1:ii+1), [2:numel(A)-1] , 'UniformOutput', 0);
C(:)

ans = 

    'ako'
    'kob'
    'oba'
    'bab'
    'aby'
    'byd'

答案 2 :(得分:2)

具有强大bsxfun功能的单行解决方案:

s = 'akobabyd'; %// input string
n = 3; %// number of chars of each substring
result = s(bsxfun(@plus, 1:n, (0:(numel(s)-n)).'));