感谢您对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个元素元件。
有没有快速的编程方法?
答案 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
在将来的版本中很可能是多线程的。