假设我有一个字符串:akobabyd
,如何在不使用for
循环的情况下每3个字符创建一个子字符串数组?预期输出:ako kob oba bab aby byd
*这不是家庭作业,只是我需要考虑的解决方案。
由于
答案 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
您可以看到它仅使用ones
和zeros
以及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)).'));