我有一个矩阵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
答案 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;