基于matlab的起始位置和结束位置的两个向量选择向量的元素

时间:2012-07-23 09:43:28

标签: matlab vectorization

感谢您对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个元素元件。

有没有快速的编程方法?

2 个答案:

答案 0 :(得分:1)

将您的选择放入单元格数组中,并将您的函数应用于每个单元格:

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单元阵列。

答案 1 :(得分:0)

如果你想以高度浓缩的形式运行它,你可以写(为清晰起见,用两行代表)

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在将来的版本中很可能是多线程的。