首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中循环2的矢量化

MATLAB中循环2的矢量化
EN

Stack Overflow用户
提问于 2013-10-24 01:09:34
回答 2查看 179关注 0票数 1

我刚刚开始探索向量化的世界。我已经完成了一维矢量化,但是我很难将下面的代码向量化。我想消除至少一个for循环,如果可能的话,b/c,我计划在一个更大的数据集中使用它,在许多迭代中,所以节省计算时间是至关重要的。

代码语言:javascript
复制
CityPairs = [7 3
3 1
3 1
1 7
7 1
3 4
5 1
4 6];
Offices = [1;3;7];
nOffices = size(Offices,1);

connection = zeros(nOffices);
for i = 1:nOffices
    for j = 1:nOffices
        connection(i,j) = sum(Offices(i) == CityPairs(:,1)...
            & CityPairs(:,2) == Offices(j));
    end
end   
disp(connection)

在这个例子中,有7个城市,其中3个有办公室。我想要一个有办公室的城市的成对矩阵,以捕捉每个城市之间所有单向连接的总和。以上问题的答案应该是:

代码语言:javascript
复制
 0     0     1
 2     0     0
 1     1     0

欢迎任何建议。提前谢谢。

基思

EN

回答 2

Stack Overflow用户

发布于 2013-10-24 08:16:22

你的任务是做一些选择性的交叉列表。您可以轻松地将计数积累到感兴趣的位置,并由您的Offices进行索引。

代码语言:javascript
复制
% Row and col subs
[~,rsubs] = ismember(CityPairs(:,1),Offices);
[~,csubs] = ismember(CityPairs(:,2),Offices);

% Select where both belong to Offices, i.e. non 0
subs = [rsubs,csubs];
subs = subs(all(subs,2),:);

% Accumulate
accumarray(subs,1)

结果

代码语言:javascript
复制
ans =
     0     0     1
     2     0     0
     1     1     0

如果您有统计工具箱,可以直接使用crosstab,但是需要选择感兴趣的行和列:

代码语言:javascript
复制
crosstab(CityPairs(:,1),CityPairs(:,2))
ans =
     0     0     0     0     1
     2     0     1     0     0
     0     0     0     1     0
     1     0     0     0     0
     1     1     0     0     0
票数 2
EN

Stack Overflow用户

发布于 2013-10-24 14:06:31

Cedric在MathWorks论坛上的回答

将此设置“向量化”并不简单,因为有些操作需要一些查找表,并且存在累积(除非您找到了一个技巧)。这可能会使没有FOR循环的方法比基本的、基于循环的方法更复杂(从代码上讲)。所以让我们先从技巧开始;-)

代码语言:javascript
复制
 A = double( bsxfun(@eq, CityPairs(:,1), Offices.') ) ;
 B = double( bsxfun(@eq, CityPairs(:,2), Offices.') ) ;
 A.' * B

替代方法:http://www.mathworks.com/matlabcentral/answers/91294-vectorization-of-2-for-loops-in-matlab

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

https://stackoverflow.com/questions/19555136

复制
相关文章

相似问题

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