矢量化的小代码片段

时间:2015-12-19 14:38:28

标签: matlab vectorization

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数组,但无论如何都没有用。

1 个答案:

答案 0 :(得分:1)

通过使用arrayfun在输入的所有元素上应用特定函数,可以摆脱for循环。但是,我不确定它是否比loopy版本快得多。

下面的代码生成的输出相当于原始单元格数组L

L2 = arrayfun(@(x,y)q(x:y), From, To, 'UniformOutput', false);

此处,@(x,y)q(x:y)定义了一个匿名函数,该函数根据输入qxy返回子向量,这些输入由arrayfun从您的From中选取输入向量ToL_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

但在这种情况下,实际编写已命名的函数可能更好。