Building matrix of differences

Say I have a vector v=[v1,...,vn].'. How can I generate the matrix D with components D(i,j) = vi - vj ? The dimension of the vector n is very large, so efficiency matters. Ideally I would like to generate the following matrix E(i,j) = 1/(vi-vj) for vi ~= vj (which we may assume corresponds to i~=j) and E(i,i) = 0.
Is there a fast way to do it? Doing it with loops is very slow.
Thanks a lot,
L

回答 (1 件)

Star Strider
Star Strider 2017 年 5 月 19 日

0 投票

See if this does what you want:
v = randi(9, 1, 5); % Create Data
D = bsxfun(@minus, v, v'); % Subtract To Create Matrix
Dnz = D~=0; % Logical Matrix (Becomes Numeric)
Dinv = Dnz./D; % Element-Wise ‘Inverse’
Note that ‘0/0’ become NaN values.

2 件のコメント

Lorenzo
Lorenzo 2017 年 5 月 19 日
Thanks this is pretty good! I was using a combination of meshgrid, cat and reshape but this is more slick. Do you know a way to convert the Nan into zeroes? Unfortunately it still seems to be slower than half of the double loop. I will wait a little bit to see if there are more answer and then accept this one. Thanks again!
Star Strider
Star Strider 2017 年 5 月 19 日
My pleasure!
To convert the NaN values to 0, add this assignment to my previous code:
Dinv(~Dnz) = 0; % Convert ‘NaN’ To ‘0’

サインインしてコメントする。

カテゴリ

質問済み:

2017 年 5 月 19 日

コメント済み:

2017 年 5 月 19 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by