我刚刚开始探索向量化的世界。我已经完成了一维矢量化,但是我很难将下面的代码向量化。我想消除至少一个for循环,如果可能的话,b/c,我计划在一个更大的数据集中使用它,在许多迭代中,所以节省计算时间是至关重要的。
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个有办公室。我想要一个有办公室的城市的成对矩阵,以捕捉每个城市之间所有单向连接的总和。以上问题的答案应该是:
0 0 1
2 0 0
1 1 0欢迎任何建议。提前谢谢。
基思
发布于 2013-10-24 08:16:22
你的任务是做一些选择性的交叉列表。您可以轻松地将计数积累到感兴趣的位置,并由您的Offices进行索引。
% 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)结果
ans =
0 0 1
2 0 0
1 1 0如果您有统计工具箱,可以直接使用crosstab,但是需要选择感兴趣的行和列:
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发布于 2013-10-24 14:06:31
Cedric在MathWorks论坛上的回答
将此设置“向量化”并不简单,因为有些操作需要一些查找表,并且存在累积(除非您找到了一个技巧)。这可能会使没有FOR循环的方法比基本的、基于循环的方法更复杂(从代码上讲)。所以让我们先从技巧开始;-)
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
https://stackoverflow.com/questions/19555136
复制相似问题