1

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

有没有一种快速的编程方法?

4

2 回答 2

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

于 2012-07-23T10:01:10.477 回答
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在未来的版本中可能会是多线程的。

于 2012-07-23T16:42:50.660 回答