Для этого есть (в R2015a) встроенная и документированная функция, repelem
. Следующий синтаксис, где второй аргумент является вектором, имеет значение здесь:
blockquote>
W = repelem(V,N)
, с векторомV
и векторомN
, создает векторW
, где элементV(i)
повторяетсяN(i)
раз.Или иначе: «Каждый элемент из
N
указывает количество раз, чтобы повторить соответствующий элемент изV
».Пример:
>> a=[1,3,2,5] a = 1 3 2 5 >> b=[2,2,1,3] b = 2 2 1 3 >> repelem(a,b) ans = 1 1 3 3 2 5 5 5
См. Документацию по следующему методу:
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Apple четко говорит следующее:
Если длина диапазона не равна replaceLength, приемник размер изменен для размещения новых байтов. Любые байты за пределами диапазона в приемнике сдвинуты, чтобы приспособиться к новым байтов. Поэтому вы можете передать NULL для replaceBytes и 0 для replaceLength для удаления байтов в приемник в диапазоне дальности. Ты также может заменить диапазон (который может быть нулевой длины) с большим количеством байтов, чем длина диапазона, в котором эффект вставки (или «заменить некоторые и вставьте еще »).
Чтобы удалить 10 байт с конца, используйте:
[data setLength:[data length] - 10];
Это также можно сделать с помощью replaceBytesInRange, но на самом деле это намного быстрее, потому что байты на самом деле не удаляются. Вместо этого изменяется только внутренняя переменная размера, и NSMutableData будет вести себя так, как если бы байты были удалены. IOW, это операция O (1) (это означает, что она всегда будет выполняться одинаково долго, независимо от того, сколько байтов вы удаляете), и это очень быстро.
Чтобы удалить 10 байтов спереди, используйте:
[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];
Чтобы удалить 10 байтов в середине (например, после 20 байтов), используйте:
[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];
replaceBytesInRange - это операция O (n). Это означает, что независимо от того, сколько времени потребуется для удаления 100 байтов, удаление 200 байтов и так далее займет в два раза больше времени.Это все еще довольно быстро и ограничивается только пропускной способностью памяти вашего компьютера (RAM). Если у вас есть 10 МБ данных и вы удаляете 1 МБ спереди, 9 МБ копируются, чтобы заполнить пробел в только что удаленном МБ. Таким образом, скорость операции зависит от того, насколько быстро ваша система может переместить 9 МБ ОЗУ с одного адреса на другой. И обычно этого бывает достаточно быстро, если вы не имеете дело с объектами NSMutableData, содержащими сотни МБ.
Если данные, которые вы хотите удалить, находятся в конце, вы можете использовать
[NSMutableDataInstance setLength: [NSMutableDataInstance length] - n];
или с синтаксисом obj-c 2.0
NSMutableDataInstance.length -= n;
для чего-то более сложного, чем это, я бы рекомендовал манипулировать необработанными данными.
Поскольку NSMutableData является бесплатным мостом с CFMutableDataRef, вы можете использовать функцию CFDataDeleteBytes ():
NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));