Writing a summation code where i≠j

조회 수: 9 (최근 30일)
aposta95
aposta95 2022년 6월 10일
댓글: Jan 2022년 6월 10일
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;

채택된 답변

Voss
Voss 2022년 6월 10일
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
aposta95
aposta95 2022년 6월 10일
Many thanks for your elaboration :)
Voss
Voss 2022년 6월 10일
You're welcome!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Abhishek Chakram
Abhishek Chakram 2022년 6월 10일
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

David Hill
David Hill 2022년 6월 10일
No loops needed
G=sum(w.*x.*x','all')/sum(x.*x','all');
  댓글 수: 1
Jan
Jan 2022년 6월 10일
Isn't the "for all i~=j" missing?

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by