0

Très nouveau pour Matlab, j'utilise habituellement STATA. Je veux utiliser la fuction nchoosek pour obtenir la somme des vecteurs dans une matrice.Affectation de valeurs à une matrice par addition vectorielle à partir d'une matrice d'adjacence

J'ai une matrice d'adjacence 21x21, avec 0 ou 1 comme entrées. Je veux créer une nouvelle matrice, qui me donnera une somme d'entrées entre toutes les triades possibles de la matrice d'adjacence.

La nouvelle matrice devrait avoir quatre variables, indices (i, j, k) - correspondant à chaque combinaison de la 21x21. Et une dernière variable qui est une somme des entrées.

Le code que j'ai à ce jour est:

C = nchoosek(21,3) 
B = zeros(nchoosek(21,3), 4) 
for i=1:C 
    for j=i+1:C 
     for k=j+1:C 
      B(?)=B(i, j, k, A(i)+A(j)+A(k)) #A is the 21x21 adj mat 
     end 
    end 
end 

Je sais que ma déclaration d'affectation est incorrecte car je ne comprends le rôle terminé d'indexation du « : » opérateur. Toute aide serait appréciée.

Merci!

+3

voulez-vous résumer toutes les lignes ou les colonnes triades possibles? Ou voulez-vous résumer toutes les combinaisons possibles des 441 éléments de votre matrice? Un exemple avec une matrice plus petite rendra cette question plus claire – anyanwu

Répondre

0

Cela pourrait être ce que vous voulez:

clear all 
close all 
clc 

A = rand(21,21); % Replace this with actual A 
rowNum = 0; 
for i=1:21 
    for j=i+1:21 
     for k=j+1:21 
      rowNum = rowNum+1; 
      B(rowNum,:) = [i, j, k, sum(A(:,i)+A(:,j)+A(:,k))]; 
     end 
    end 
end 

Il y a quelques points:

  • boucle Vous pour des combinaisons différentes. le nombre total de combinaisons est nchoosek(21,3) que vous pouvez vérifier après 3 boucles imbriquées. Votre code avec for i=1:C était la première erreur depuis que vous êtes en train de boucler pour différentes valeurs de i et différentes valeurs de j et k. Donc, ces 21 valeurs ne sont plus.
  • Pour éviter les combinaisons répétées, il suffit de lancer un nouvel index après le précédent, que vous avez réalisé dans votre code.
  • Il existe d'autres approches possibles telles que le format vectorisé, mais pour coller à votre approche, j'ai utilisé un compteur: rowNum qui est le compteur de boucle et mis à jour le long de la boucle.
  • B (numLigne, :) signifie tout élément de rowNum'th ligne de la matrice B.
0

Ci-dessous un algorithme pour trouver les triades dans une matrice d'adjacence. Il vérifie toutes les triades possibles et additionne les valeurs.

%basic adjacency matrix with two triads (1-2-5) (2-3-5) 
A=[]; 
A(1,:) = [0 1 0 0 1]; 
A(2,:) = [1 0 1 0 1]; 
A(3,:) = [0 1 0 0 1]; 
A(4,:) = [0 0 0 0 1]; 
A(5,:) = [1 1 1 1 0]; 
A=A==1; %logical matrix 

triads=nchoosek(1:5,3); 
S=nan(size(triads,1),4); 
for ct = 1:size(triads,1) 
    S(ct,1:3)=[A(triads(ct,1),triads(ct,2)),A(triads(ct,1),triads(ct,3)),A(triads(ct,2),triads(ct,3))]; 
    S(ct,4)=sum(S(ct,1:3)); 
end 
triads(find(S(:,4)==3),:) 

ans =

1  2  5 
2  3  5