Matlab 为不同的子字符串分隔字符串
假设我有一个字符串:Matlab 为不同的子字符串分隔字符串,matlab,Matlab,假设我有一个字符串:akobabyd,我如何在不使用for循环的情况下,每3个字符生成一个其子字符串数组?预期产量:ako kob oba bab aby byd *这不是家庭作业,只是我在解决问题的过程中需要考虑的一个步骤 谢谢这个怎么样: A = 'akobabyd'; C = arrayfun(@(ii) A(ii-1:ii+1), [2:numel(A)-1] , 'UniformOutput', 0); C(:) ans = 'ako' 'kob' 'o
akobabyd
,我如何在不使用for
循环的情况下,每3个字符生成一个其子字符串数组?预期产量:ako kob oba bab aby byd
*这不是家庭作业,只是我在解决问题的过程中需要考虑的一个步骤
谢谢这个怎么样:
A = 'akobabyd';
C = arrayfun(@(ii) A(ii-1:ii+1), [2:numel(A)-1] , 'UniformOutput', 0);
C(:)
ans =
'ako'
'kob'
'oba'
'bab'
'aby'
'byd'
这个怎么样:
A = 'akobabyd';
C = arrayfun(@(ii) A(ii-1:ii+1), [2:numel(A)-1] , 'UniformOutput', 0);
C(:)
ans =
'ako'
'kob'
'oba'
'bab'
'aby'
'byd'
如果可以使用内置函数,则可以使用生成一个窗口序列,在该序列中可以一次提取三个字符,并将它们放入二维矩阵中,其中每行是一个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
您可以看到,它只使用一
和零
,以及类
来确保我们得到的任何数据都是输出的数据。我们可以简化这个过程,因为我们知道只有数字数据(特别是双精度的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.');
如果可以使用内置函数,则可以使用生成一个窗口序列,在该序列中可以一次提取三个字符,并将它们放入二维矩阵中,其中每行是一个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
您可以看到,它只使用一
和零
,以及类
来确保我们得到的任何数据都是输出的数据。我们可以简化这个过程,因为我们知道只有数字数据(特别是双精度的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.');
具有强大功能的单线解决方案:
s = 'akobabyd'; %// input string
n = 3; %// number of chars of each substring
result = s(bsxfun(@plus, 1:n, (0:(numel(s)-n)).'));
具有强大功能的单线解决方案:
s = 'akobabyd'; %// input string
n = 3; %// number of chars of each substring
result = s(bsxfun(@plus, 1:n, (0:(numel(s)-n)).'));
@Osh24我修改了答案。从技术上讲,这仍然是一个for
循环。@rayryeng不像问题中那样是for
循环,而且问题并没有禁止arrayfun
@Marcin-我想你把我带到了那里!然后C=vertcat(C{:})
ifneeded@Osh24我修改了答案。从技术上讲,这仍然是一个for
循环。@rayryeng不像问题中那样是for
循环,而且问题并没有禁止arrayfun
@Marcin-我想是你让我做到了!然后C=vertcat(C{:})
!无论如何,要复制汉克尔矩阵而不使用hankel()
?@Osh24-mmmm。。。这可能很困难。让我再给你打电话。@Osh24-完成。祝你好运@rayryeng想得好--hankel
!美好的无论如何,要复制汉克尔矩阵而不使用hankel()
?@Osh24-mmmm。。。这可能很困难。让我再给你打电话。@Osh24-完成。祝你好运@rayryeng想得好--hankel
<代码>bsxfun
也应获得+1:)bsxfun
也应获得+1:)