【问题标题】:Spread elements of rows to multiple rows将行的元素分布到多行
【发布时间】:2018-08-08 20:08:06
【问题描述】:

我正在使用邻接矩阵研究图论,我想在多个节点之间分割边,例如我有以下初始邻接矩阵:

    a= [ 0 2 3;
         2 0 1;
         3 1 0]

从该矩阵可以清楚地看出我们有 3 个节点,现在我想将上述行(边)拆分为 (1-3) 之间的新随机节点:

 split= randi([1 3],1,length(A));
 split = [ 2 2 1]

我现在知道我需要将第一行的元素分成两行,第二行的元素也分成两行,而第三行的元素将保持原样,我会有新的大小为 5X5 的矩阵如下:

    A = [0 0 2 0 3;
         0 0 0 0 0;
         2 0 0 0 1;
         0 0 0 0 0;
         3 0 1 0 0]     

我想要做的是将第一行中的非零元素在这一行和第二行之间拆分,第三行与第四行拆分,所以我的矩阵看起来像:

    An = [0 0 2 0 0;
          0 0 0 0 3;
          2 0 0 0 0;
          0 0 0 0 1;
          0 3 0 1 0]

【问题讨论】:

  • 所以如果split = [3 3 3] 那么An 将是一个[9 x 9] 矩阵。对吗?
  • @rahnema1 没错!
  • 矩阵对角线不应该是0吗?
  • @rahnema1 是的,分裂前后一直都是这样
  • 对不起,但是……上下移动一行的非零值的标准是什么?

标签: matlab split adjacency-matrix edges


【解决方案1】:

这里An是直接从a生成的,没有创建A

a = [ 0 2 3;
      2 0 1;
      3 1 0];

split = [ 2 2 1];

L = length(a);
cum = cumsum([1 split(1:end-1)]);

%ro = rot90(split - (0:L-1).' + cum-1, -1); %MATLAB R2016b
ro = rot90(bsxfun(@minus,split + cum-1 , (0:L-1).') , -1);
co = repmat(cum, L, 1);
idx = triu(true(L), 1);

N =  sum(split);
An = zeros(N);
sub = sub2ind([N,N], ro(idx), co(idx));
An(sub) = a(idx);
An = An + An.'

An =
0   0   2   0   0
0   0   0   0   3
2   0   0   0   0
0   0   0   0   1
0   3   0   1   0

【讨论】:

  • 非常感谢您的回答,我尝试运行它以获得更大的指标,它给了我以下错误:错误使用 sub2ind 超出范围下标
  • 您应该确定如何拆分一行。例如如何将[ 3 4 5 6 2] 分成两部分?
【解决方案2】:

我并不完全清楚什么是初始点、先决条件和条件。我假设每第二行/列都是零的行/列。我还假设非零行/列正好有两个非零值,而第二个值应该移动到下一行/列。为此,我建议:

A = [0 0 2 0 3 ; 0 0 0 0 0 ; 2 0 0 0 1 ; 0 0 0 0 0 ; 3 0 1 0 0];

for n = 1:2
    if n==2
        A = A';
    end % if
    for k = 1:2:size(A,1)-1
        m = find(A(k,:));
        A(k+(0:1),m(end)) = flipud(A(k+(0:1),m(end)));
    end % for
    if n==2
        A = A';
    end % if
end % for

A

A =

     0     0     2     0     0
     0     0     0     0     3
     2     0     0     0     0
     0     0     0     0     1
     0     3     0     1     0

【讨论】:

  • 非常感谢您的回复,我已经编辑了我的问题以获得更多详细信息。
猜你喜欢
  • 2013-06-02
  • 2017-05-12
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多