1

我有一个矩阵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
4

2 回答 2

5

成对欧几里得距离使用pdist,它在 C 中进行繁重的工作,并squareform创建距离矩阵

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

如果您需要更快(虽然 365×365 不是很大),请在此处查看我的答案或尝试使用此文件交换程序

于 2013-07-29T19:11:49.757 回答
4

您无法击败horchler 的回答,但为了完整起见,这里是如何使用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;
于 2013-07-29T20:31:32.403 回答