用于循环替换的Matlab

时间:2012-02-28 13:25:54

标签: matlab matrix

我正在尝试减少代码中的循环量以加快计算速度。我遇到了一部分代码,我正在完成一个循环,我看不到解决方案。

我有一个各种粒子的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)的矩阵。

2 个答案:

答案 0 :(得分:2)

您可以使用bsxfun,但您还需要permute来“3D转置”坐标矩阵。 permutecoordinates分别变为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