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维数组,但无论如何都行不通。
您可以for
通过arrayfun
在输入的所有元素上应用特定功能来摆脱循环。但是,我不确定它是否会比循环版本快得多。
以下代码产生的输出与原始单元格数组等效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);
但是在这种情况下,最好已经实际编写了一个命名函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句