Вы могли бы фактически использовать функцию ISMEMBER , чтобы получить индексный вектор для того, где ячейки в largecellarray
находятся в меньшем массиве smallcellarray
, затем использовать функцию STRFIND (которая работает с обеими строковыми и числовыми массивами), чтобы найти начальные индексы меньшего массива в пределах большего:
>> nSmall = numel(smallcellarray);
>> [~, matchIndex] = ismember(largecellarray,... %# Find the index of the
smallcellarray); %# smallcellarray entry
%# that each entry of
%# largecellarray matches
>> startIndices = strfind(matchIndex,1:nSmall) %# Starting indices where the
%# vector [1 2 3] occurs in
startIndices = %# matchIndex
1 6
Тогда нужно построить вектор index
из этихстартовые показатели.Вот один способ, которым вы можете создать этот вектор:
>> nLarge = numel(largecellarray);
>> endIndices = startIndices+nSmall; %# Get the indices immediately after
%# where the vector [1 2 3] ends
>> index = zeros(1,nLarge); %# Initialize index to zero
>> index(startIndices) = 1; %# Mark the start index with a 1
>> index(endIndices) = -1; %# Mark one index after the end with a -1
>> index = cumsum(index(1:nLarge)) %# Take the cumulative sum, removing any
%# extra entry in index that may occur
index =
1 1 1 0 0 1 1 1
Другой способ создать его с помощью функции BSXFUN задается как Amro .Еще один способ создать его:
index = cumsum([startIndices; ones(nSmall-1,numel(startIndices))]);
index = ismember(1:numel(largecellarray),index);