Извлечение фиксированных объемов данных из массива на основе списка индексов
У меня есть массив
a=1:20
и ряд индексов, которые указывают, где я хочу начать извлекать данные:
i=[4,12]
Для каждого индекса i
Я хочу этот индекс и следующие четыре (ну, x
действительно) элементы в столбце или строке. Я не буду приближаться к концу массива, так что особый случай можно игнорировать.
Если бы я жестко запрограммировал это, я мог бы использовать:
a([4:8;12:16])
и это достигнет моего результата.
Но i
может иметь много разных значений.
Любые мысли о том, как я могу преобразовать список индексов в матрицу диапазонов, или другие способы решения этой проблемы?
РЕДАКТИРОВАТЬ Я использую Matlab 2007; было бы предпочтительнее, если бы решение опиралось исключительно на внутренние компоненты и наборы инструментов Matlab. bsxfun
не присутствует до 2007а.
2 ответа
Позволять i
будь твоим указателем и x
количество элементов, которые вы хотите в дополнение к элементам в i
тогда вы можете использовать
i = [4 6 8];
x = 4;
bsxfun(@plus, 0:x, i(:))
получить матрицу показателей:
ans =
4 5 6 7 8
6 7 8 9 10
8 9 10 11 12
Если у вас нет доступа к bsxfun
ты можешь использовать repmat
вместо:
i = [4 6 8];
x = 4;
repmat(i(:), 1, x+1) + repmat(0:x, length(i), 1)
Вот решение без bsxfun, но с repmat, вдохновленным предыдущим ответом.
i = [4 6 8];
x = 4;
p = repmat(1:x,length(i),1);
q = repmat(i',1,x);
p+q