首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >小代码段的矢量化

小代码段的矢量化
EN

Stack Overflow用户
提问于 2015-12-19 14:38:27
回答 1查看 80关注 0票数 2
代码语言:javascript
复制
q=
 2
 4
 6
 1
 6
 8

From=
 1
 4
 2

To=
 3
 6
 3

q是一个点的序列。例如,q(From(1):To(1))给出了2,4,6。我想把这个例子向量化。

这是非矢量化工作代码:

代码语言:javascript
复制
J=3;
L=cell(J,1);
for j=1:J
    L{j}=q(From(j):To(j));
end

其结果是:

代码语言:javascript
复制
L=
 2,4,6   % j=1
 1,6,8   % j=2
 4,6     % j=3

我不知道如何获得这段代码的向量化形式。我试图将L转换为2-dim数组,但是无论如何,没有什么工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-19 14:44:34

您可以通过使用for对输入的所有元素应用特定函数来摆脱arrayfun循环。但是,我不确定它是否会比这个疯狂的版本快得多。

下面的代码生成与原始单元格数组L等效的输出。

代码语言:javascript
复制
L2 = arrayfun(@(x,y)q(x:y), From, To, 'UniformOutput', false);

在这里,@(x,y)q(x:y)定义了一个匿名函数,它根据输入xyq返回子向量,这是由arrayfun从输入向量FromTo中选择的。

正如注释中所建议的那样,如果您希望具有额外的通用性,可以指定另一个函数句柄,如下所示:

代码语言:javascript
复制
L_fun = @(q)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);

然后,...and将其称为任意向量(不一定是原始的q):

代码语言:javascript
复制
q2 = rand(10,1); %// Random vector for testing
Lout = L_fun(q2); %// Use From and To to pick from q2

甚至定义一个接受所有输入的句柄:

代码语言:javascript
复制
L_fun = @(q,From,To)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);

但在这种情况下,最好已经编写了一个命名函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34371911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档