Writing a summation code where i≠j

22 vues (au cours des 30 derniers jours)
aposta95
aposta95 le 10 Juin 2022
Commenté : Jan le 10 Juin 2022
Hi, I want to write a summation code to calculate Getis ord index as below:
.
Here, x is a 1xn vector, and w is a square matrix where w_ii=0
I wrote the code to calculate the denominator, but it's quite complicated to calculate the nominator.
I tried with the below code, but I'm not sure it's right...
How can I do that?
x = [1,2,3,4]; % feature vector
w= rand(4,2); D=pdist(w);
W= squareform(D); % weight matrix
% Calculate Denominator
denom=0;
for i = 1:4
for j = 1:4
if i~=j
denom = denom + x(j)*x(i);
end
end
end
% Calculate nominator
Wu = triu(W,1);
Wd = tril(W,-1);
nom = (sum(sum(Wu)) + sum(sum(Wd))) * denom;

Réponse acceptée

Voss
Voss le 10 Juin 2022
The weight matrix is zeros along the diagonal. Thus you can use it as-is in the summation, since the terms where i==j (which correspond to the diagonal elements of W) will be 0.
To get the same effect in the denominator, you can set the diagonal elements of x.*x.' to zero and use that.
x = [1,2,3,4]; % feature vector
w = rand(4,2);
D = pdist(w);
W = squareform(D) % weight matrix
W = 4×4
0 0.4616 0.3697 0.5919 0.4616 0 0.8026 0.7224 0.3697 0.8026 0 0.8581 0.5919 0.7224 0.8581 0
denom_matrix = x.*x.';
denom_matrix(1:numel(x)+1:end) = 0
denom_matrix = 4×4
0 2 3 4 2 0 6 8 3 6 0 12 4 8 12 0
G = sum(W.*x.*x.','all')/sum(denom_matrix,'all')
G = 0.7226
For reference, here is a way to do the same thing using for loops:
denominator = 0;
numerator = 0;
for ii = 1:numel(x)
for jj = 1:numel(x)
if ii == jj % skip the ii == jj terms
continue
end
denominator = denominator + x(ii)*x(jj);
numerator = numerator + W(ii,jj)*x(ii)*x(jj);
end
end
G_loop = numerator/denominator
G_loop = 0.7226
Check that the results are identical:
isequal(G,G_loop)
ans = logical
1
  2 commentaires
aposta95
aposta95 le 10 Juin 2022
Many thanks for your elaboration :)
Voss
Voss le 10 Juin 2022
You're welcome!

Connectez-vous pour commenter.

Plus de réponses (2)

Abhishek Chakram
Abhishek Chakram le 10 Juin 2022
Hi,
As I understood, you want to calculate the numerator of Getis ord index.
You can do it the same way as you calculated the denominator. The code will look like :
numerator = 0;
for i = 1:4
for j = 1:4
if i~=j
numerator = numerator + W(i,j)*x(i)*x(j);
end
end
end
  1 commentaire
aposta95
aposta95 le 10 Juin 2022
Thanks it works :)

Connectez-vous pour commenter.


David Hill
David Hill le 10 Juin 2022
No loops needed
G=sum(w.*x.*x','all')/sum(x.*x','all');
  1 commentaire
Jan
Jan le 10 Juin 2022
Isn't the "for all i~=j" missing?

Connectez-vous pour commenter.

Catégories

En savoir plus sur Creating and Concatenating Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by