q=
2
4
6
1
6
8
From=
1
4
2
To=
3
6
3q是一个点的序列。例如,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数组,但是无论如何,没有什么工作。
发布于 2015-12-19 14:44:34
您可以通过使用for对输入的所有元素应用特定函数来摆脱arrayfun循环。但是,我不确定它是否会比这个疯狂的版本快得多。
下面的代码生成与原始单元格数组L等效的输出。
L2 = arrayfun(@(x,y)q(x:y), From, To, 'UniformOutput', false);在这里,@(x,y)q(x:y)定义了一个匿名函数,它根据输入x和y从q返回子向量,这是由arrayfun从输入向量From和To中选择的。
正如注释中所建议的那样,如果您希望具有额外的通用性,可以指定另一个函数句柄,如下所示:
L_fun = @(q)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);然后,...and将其称为任意向量(不一定是原始的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);但在这种情况下,最好已经编写了一个命名函数。
https://stackoverflow.com/questions/34371911
复制相似问题