我正在尝试减少代码中的循环量以加快计算速度。我遇到了一部分代码,我正在完成一个循环,我看不到解决方案。
我有一个各种粒子的x
y
个坐标矩阵。
例如,生成为rand(2,5)
0.8715 0.0363 0.0657 0.6289 0.3279
0.0272 0.4380 0.9794 0.6563 0.4755
我想在(5,5,2)
中使用矩阵,每个粒子之间都有一个向量。
这将是x
长度为(:,:,1)
且y长度为(:,:,2)
的矩阵。
答案 0 :(得分:2)
您可以使用bsxfun
,但您还需要permute
来“3D转置”坐标矩阵。 permute
将coordinates
分别变为5乘1乘2和1乘5乘2阵列:
coordinates = rand(2,5);
%# subtract all coordinate pairs from one another
vectorArray = bsxfun(@minus,permute(coordinates,[2,3,1]),permute(coordinates,[3 2 1]));
size(vectorArray)
ans =
5 5 2
请注意,vectorArray是反对称的,因此如果遇到空间问题,您可能需要查看pdist
。
答案 1 :(得分:0)
这是一个基于索引的解决方案,使用REPMAT创建linear index到坐标矩阵中,CAT创建三维矩阵结果:
>> xy = [0.8715 0.0363 0.0657 0.6289 0.3279; ... %# Your coordinates
0.0272 0.4380 0.9794 0.6563 0.4755];
>> N = size(xy, 2);
>> index = repmat(1:2:2*N, N, 1); %# A matrix of linear indices into xy
>> result = cat(3, xy(index)-xy(index.'), ... %.'# X differences
xy(index+1)-xy(index.'+1)) %.'# Y differences
result(:,:,1) =
0 -0.8352 -0.8058 -0.2426 -0.5436
0.8352 0 0.0294 0.5926 0.2916
0.8058 -0.0294 0 0.5632 0.2622
0.2426 -0.5926 -0.5632 0 -0.3010
0.5436 -0.2916 -0.2622 0.3010 0
result(:,:,2) =
0 0.4108 0.9522 0.6291 0.4483
-0.4108 0 0.5414 0.2183 0.0375
-0.9522 -0.5414 0 -0.3231 -0.5039
-0.6291 -0.2183 0.3231 0 -0.1808
-0.4483 -0.0375 0.5039 0.1808 0