q=
2
4
6
1
6
8
From=
1
4
2
To=
3
6
3
q
是一系列点数。例如,q(From(1):To(1))
给出2,4,6
。我想对这个例子进行矢量化。
这是非矢量化的工作代码:
J=3;
L=cell(J,1);
for j=1:J
L{j}=q(From(j):To(j));
end
结果是:
L=
2,4,6 % j=1
1,6,8 % j=2
4,6 % j=3
我无法弄清楚如何获得此代码的矢量化形式。我试图将L
转换为2-dim数组,但无论如何都没有用。
答案 0 :(得分:1)
通过使用arrayfun
在输入的所有元素上应用特定函数,可以摆脱for
循环。但是,我不确定它是否比loopy版本快得多。
下面的代码生成的输出相当于原始单元格数组L
:
L2 = arrayfun(@(x,y)q(x:y), From, To, 'UniformOutput', false);
此处,@(x,y)q(x:y)
定义了一个匿名函数,该函数根据输入q
和x
从y
返回子向量,这些输入由arrayfun
从您的From
中选取输入向量To
和L_fun = @(q)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);
。
正如评论中所建议的那样,如果你需要额外的通用性,你可以指定另一个函数句柄:
q
...然后将其称为任意向量(不一定是您原来的q2 = rand(10,1); %// Random vector for testing
Lout = L_fun(q2); %// Use From and To to pick from q2
):
L_fun = @(q,From,To)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);
甚至可以定义一个获取所有输入的句柄:
NSUserDefaults
但在这种情况下,实际编写已命名的函数可能更好。