【问题标题】:Assigning values to a matrix through vector addition from an adjacency matrix通过邻接矩阵的向量加法将值分配给矩阵
【发布时间】:2017-12-05 03:18:41
【问题描述】:

对 Matlab 非常陌生,我通常使用 STATA。

我想使用 nchoosek 函数来获得一个矩阵中向量的总和。

我有一个 21x21 的邻接矩阵,输入为 0 或 1。我想创建一个新矩阵,它将为我提供邻接矩阵中所有可能的三元组之间的输入总和。

新矩阵看起来应该有四个变量,索引 (i, j, k) - 对应于 21x21 中的每个组合。最后一个变量是输入的总和。

我目前的代码是:

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

我知道我的赋值语句不正确,因为我没有完全理解“:”运算符的索引角色。任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您想对所有可能的三元行或列求和吗?或者您想对矩阵中 441 个元素的所有可能组合求和?一个矩阵较小的例子会让这个问题更清楚

标签: matlab matrix combinatorics adjacency-matrix matrix-indexing


【解决方案1】:

这可能是你想要的:

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,:) 表示矩阵 B 的第 rowNum 行的所有元素。

【讨论】:

    【解决方案2】:

    以下是在邻接矩阵中查找三元组的算法。它检查所有可能的三元组并对值求和。

    %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
    

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 2013-02-05
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多