在Matlab中矢量化双循环

时间:2013-07-29 19:05:22

标签: matlab vectorization

我有一个矩阵A,其中包含一年中每一天的24个值(每小时一个值)。 A的每一列都是不同的一天,每天有24行数据(A是24乘365)。我想通过比较每天的小时数据来比较每一天。为此,我将获取一列数据并将其与下一列进行比较。我将两列中每小时数据的差异取出,然后将它们平方并求和得到一个值,表示两天的相似程度。然后,我使用每个可能的天数组合执行此操作,创建365乘365的矩阵d,指示每天与每一天的相似程度。例如,元素d(20,100)包含一个值,表示一年中第20天与第100天的相似程度。代码正在运行,但速度很慢,我希望能够对其进行矢量化。非常感谢帮助。

for j=1:365
    for k=1:365
        d(j,k)=sqrt(sum((A(:,j)-A(:,k)).^2));
    end
end

2 个答案:

答案 0 :(得分:5)

使用pdist成对欧几里德距离,使用C进行繁重,squareform创建distance matrix

d = squareform(pdist(A.'));

如果您需要更快的速度(365乘365不是很大),请参阅我的回答here或尝试此File Exchange program

答案 1 :(得分:4)

你无法击败horchler's answer,但为了完整起见,我们可以使用bsxfun

来完成此操作
d = bsxfun(@minus, permute(A, [3 2 1]), permute(A, [2 1 3]));
d = sqrt( sum( d.^2, 3 ) );

这样做的另一个好方法是使用|| x - y || = sqrt(||x||^2-2< x,y >+||y||^2)这一事实。因此

n = sum(A.^2, 1); % norm of each vector
b = bsxfun(@plus, n, n') - 2 * A' * A;