将行的元素散布到多行
Spread elements of rows to multiple rows
我正在使用邻接矩阵研究图论,我想在多个节点之间拆分边,例如我有以下初始邻接矩阵:
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]
我不太清楚起点、先决条件和条件是什么。我假设每一秒 row/column 都是零的 row/column。我还假设 non-zero rows/columns 正好有两个 non-zero 值,而第二个值应该移到下一个 row/column。为此,我建议:
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
这里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
我正在使用邻接矩阵研究图论,我想在多个节点之间拆分边,例如我有以下初始邻接矩阵:
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]
我不太清楚起点、先决条件和条件是什么。我假设每一秒 row/column 都是零的 row/column。我还假设 non-zero rows/columns 正好有两个 non-zero 值,而第二个值应该移到下一个 row/column。为此,我建议:
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
这里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