首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量化“for”循环

向量化“for”循环
EN

Stack Overflow用户
提问于 2011-12-11 14:24:06
回答 3查看 199关注 0票数 0

这段代码就像我想要的那样工作,但是本着好的MATLAB代码的精神,有没有一种方法来向量化它(之前的是一个k x 1向量):

代码语言:javascript
复制
start = zeros(k,1);
for i = 2:length(previous)
    if (previous(i-1) == -1)
        start(previous(i))= start(previous(i))+1;
    end    
end

一般来说,在MATLAB中向量化代码的直观方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-11 22:03:50

您可以在不使用find的情况下执行此操作,以获得最高性能:

代码语言:javascript
复制
I = [false; previous(1:end-1) == -1];
idx = previous(I);
start(idx) = start(idx) + 1;

这也避免了previous(end) == -1的风险,这将导致替代方案中的索引超出范围的错误。

请注意,如果idx包含重复的索引,则这与原始索引的工作方式不同。

票数 1
EN

Stack Overflow用户

发布于 2011-12-11 14:36:05

使用MATLAB中的find命令,该命令返回向量为TRUE的索引(i)。所以:

代码语言:javascript
复制
% precache indices i where previous(i-1) == 1
idx = find(previous==-1)+1;
start(previous(idx)) = start(previous(idx))+1;

我预先缓存idx的原因是,previous是一个很大的向量,执行find需要一段时间。否则你可以这样做

代码语言:javascript
复制
start( find(previous==-1)+1 ) = start( find(previous==-1) ) + 1;
票数 2
EN

Stack Overflow用户

发布于 2011-12-11 22:11:28

我会这样做:

代码语言:javascript
复制
prev_is_minus1 = [false; previous(1:end-1)==-1]
start = accumarray(previous(prev_is_minus1), 1, k)

我相信这与您发布的代码循环具有相同的效果。

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

https://stackoverflow.com/questions/8462330

复制
相关文章

相似问题

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