【发布时间】:2012-11-16 18:49:59
【问题描述】:
我有一个 Nx1 的值向量。我想做的是创建一个 NxN 矩阵,其中每个值代表第 i 个和第 j 个值之间的差异 - 有点像一个大的相关矩阵。我已经用循环完成了这个,但我正在寻找一种更优雅的方法来使用 MATLAB 的矢量化功能,因为这个矢量可能会变得非常大。
【问题讨论】:
我有一个 Nx1 的值向量。我想做的是创建一个 NxN 矩阵,其中每个值代表第 i 个和第 j 个值之间的差异 - 有点像一个大的相关矩阵。我已经用循环完成了这个,但我正在寻找一种更优雅的方法来使用 MATLAB 的矢量化功能,因为这个矢量可能会变得非常大。
【问题讨论】:
怎么样
diff__ = bsxfun(@minus,repmat(A,N,1),A');
可以通过这样做肯定会改进
diff__ = bsxfun(@minus,A,A');
?
一点性能检查:
N = 1000;
v = rand(N,1);
tic
diff__ = bsxfun(@minus,repmat(v,N,1),v');
toc
tic
diff__ = bsxfun(@minus,v,v');
toc
结果
Elapsed time is 105.343344 seconds.
Elapsed time is 1.124946 seconds.
(蒂姆的数据检查:
差异__ =
0 2 6 4
-2 0 4 2
-6 -4 0 -2
-4 -2 2 0
)。
【讨论】:
meshgrid 可以生成适合此目的的矩阵。获取差分矩阵
meshgrid(v) - meshgrid(v)'
例子:
>> v = [1 3 7 5]
v =
1 3 7 5
>> meshgrid(v)
ans =
1 3 7 5
1 3 7 5
1 3 7 5
1 3 7 5
>> meshgrid(v) - meshgrid(v)'
ans =
0 2 6 4
-2 0 4 2
-6 -4 0 -2
-4 -2 2 0
>>
【讨论】:
已经给出了很好的答案。但是为了凑热闹,这里有另一种方式(使用 Tim 数据)
v=[1 3 7 5];
cell2mat(arrayfun(@(i) (v(i)-v)',1:size(v,2), 'UniformOutput',false))
ans =
0 2 6 4
-2 0 4 2
-6 -4 0 -2
-4 -2 2 0
【讨论】: