Разложить элементы строк на несколько строк
Я работаю над теорией графов, используя матрицу смежности, я хочу разделить ребра между несколькими узлами, например, у меня есть следующая начальная матрица смежности:
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]
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
Вот 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