2013-07-29 69 views
1

我有一个矩阵A,它包含一年中每天的24个值(每个小时一个值)。 A的每一列是不同的一天,每天有24行的数据(A是24×365)。我想通过比较每一天的小时数据来比较每一天。要做到这一点,我需要一列数据并将其与下一列进行比较。我将两个小时中每个小时的数据进行比较,然后对它们进行平方和求和得到一个单值,表示两天的相似程度。然后,我会在每个可能的天数组合的基础上做到这一点,创建一个365×365的矩阵,d,指示每天的相似程度如何。例如,元素d(20,100)包含一个值,表示一年中的第20天与第100天的相似程度。代码正在工作,但速度很慢,我希望能够对其进行矢量化。帮助将不胜感激。在Matlab中向量化double循环

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

回答

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;