Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 为不同的子字符串分隔字符串_Matlab - Fatal编程技术网

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:)