Присвоение значений матрице путем сложения векторов из матрицы смежности

Очень новичок в Matlab, я обычно использую STATA.

Я хочу использовать функцию nchoosek, чтобы получить сумму векторов в одной матрице.

У меня есть матрица смежности 21x21 с 0 или 1 в качестве входных данных. Я хочу создать новую матрицу, которая даст мне сумму входных данных между всеми возможными триадами из матрицы смежности.

Новая матрица должна иметь четыре переменных, индексы (i, j, k) - соответствующие каждой комбинации из 21х21. И последняя переменная, которая представляет собой сумму входных данных.

Код, который у меня есть до сих пор:

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

Я знаю, что мой оператор присваивания неверен, так как я не понял роль индексации оператора ":". Любая помощь будет оценена.

Спасибо!


person user6366660    schedule 01.07.2017    source источник
comment
Вы хотите суммировать все возможные строки или столбцы триады? Или вы хотите просуммировать все возможные комбинации 441 элемента в вашей матрице? Пример с меньшей матрицей прояснит этот вопрос.   -  person ammportal    schedule 01.07.2017


Ответы (2)


Это может быть то, что вы хотите:

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

Есть некоторые моменты:

  • Вы цикл для различных комбинаций. общее количество комбинаций равно nchoosek(21,3), что вы можете проверить после 3 вложенных циклов. Ваш код с for i=1:C был первой ошибкой, поскольку вы на самом деле выполняете цикл для разных значений i и разных значений j и k. Так это всего 21 значение не больше.
  • Чтобы избежать повторных комбинаций, достаточно начинать новый индекс после предыдущего, что вы реализовали в своем коде.
  • Существуют и другие возможные подходы, такие как векторизованный формат, но чтобы придерживаться вашего подхода, я использовал счетчик: rowNum, который является счетчиком цикла и обновляется по циклу.
  • B(rowNum,:) означает все элементы rowNum-й строки матрицы B.
person SddS    schedule 01.07.2017

Ниже приведен алгоритм поиска триад в матрице смежности. Он проверяет все возможные триады и суммирует значения.

%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
person Gelliant    schedule 01.07.2017