Выбор элементов вектора на основе двух векторов начальной и конечной позиции Matlab

Я был бы признателен за вашу помощь со следующей проблемой в Matlab: у меня есть вектор, и я хотел бы выбрать его части на основе следующих двух векторов начального и конечного индексов частей:

aa = [1   22  41  64  83   105  127  147  170  190  212  233]
bb = [21  40  63  82  104  126  146  169  189  211  232  252]

В основном я хотел бы выполнить некоторую функцию на V(1:21), V(22:40),... V(233:252). Я пробовал V(aa:bb) или V(aa(t):bb(t)), где t = 1:12, но получаю только V(1:21), вероятно, потому, что V(22:40) имеет 19 элементов по сравнению с V(1:21), в котором 22 элемента.

Есть ли быстрый способ запрограммировать это?


person user1545441    schedule 23.07.2012    source источник
comment
какую функцию вы хотите применить?   -  person Gunther Struyf    schedule 23.07.2012


Ответы (2)


Поместите свой выбор в массив ячеек и примените свою функцию к каждой ячейке:

aa = [1   22  41  64  83   105  127  147  170  190  212  233]
bb = [21  40  63  82  104  126  146  169  189  211  232  252]
V = rand(252,1); % some sample data

selV = arrayfun(@(t) V(aa(t):bb(t)), 1:12,'uniformoutput',false);
result = cellfun(@yourfunction,selV)
% or
result = cellfun(@(selVi) yourfunction(selVi), selV);

Если функция, которую вы хотите применить, имеет скалярный вывод для каждого входного вектора, это должно дать вам массив 1x12. Если функция выдает векторный вывод, вам нужно будет включить параметр uniformoutput:

result = cellfun(@(selVi) yourfunction(selVi), selV,'uniformoutput',false);

который дает вам массив ячеек 1x12.

person Gunther Struyf    schedule 23.07.2012

Если вы хотите запустить это в очень сжатой форме, вы можете написать (в две строки, для ясности)

aa = [1   22  41  64  83   105  127  147  170  190  212  233]
bb = [21  40  63  82  104  126  146  169  189  211  232  252]
V = rand(252,1); % some sample data borrowed from @Gunther

%# create an anonymous function that accepts start/end of range as input
myFunctionHandle = @(low,high)someFunction(V(low:high));

%# calculate result
%# if "someFunction" returns a scalar, you can drop the 'Uni',false part
%# from arrayfun
result = arrayfun(myFunctionHandle(low,high),aa,bb,'uni',false)

Обратите внимание, что на данный момент это может работать медленнее, чем явный цикл, но arrayfun, вероятно, будет многопоточным в будущем выпуске.

person Jonas    schedule 23.07.2012