我想把一个向量转换成一个对称的空心矩阵,但我不是很熟悉Matlab。例如:r2 = randi(10,276,1);
r2 = randi(10,276,1);
并将其转换为对称空矩阵,即关于零对角线的对称矩阵(见下图)。输出矩阵应为24x24(276 + 276 + 24(零))
谢谢你的帮忙!
xiozqbni1#
你可以通过迭代行和列,粘贴r2的所需元素来获得空心矩阵。最简单的方法是跟踪你在r2中的位置。我相信如果你需要的话,可以用三角形数字直接计算r2Slice索引。
r2 = randi(10,276,1); % 1 + inverse triangular number formula numrows = 1+sqrt(2.*numel(r2)+1/4)-1/2; mat = zeros(numrows); firstelement = 1; lastelement = numrows-1; for i = 1:numrows-1 r2Slice = r2(firstelement:lastelement); mat(i,i+1:end) = r2Slice'; mat(i+1:end,i) = r2Slice; firstelement = lastelement+1; lastelement = lastelement+numrows-1-i; end
编辑:因为我无法把它从我的脑海中抹去,这里有一个直接计算指数的版本:
r2 = randi(10,276,1); % triangular nubmer formulas triang = @(x)x.*(x+1)./2; inv_triang = @(x)sqrt(2.*x+1/4)-1/2; numrows = 1+inv_triang(numel(r2)); mat = zeros(numrows); firstelement = @(i)triang(numrows-1)-triang(numrows-1-i+1)+1; lastelement = @(i)firstelement(i)+numrows-1-i; for i = 1:numrows-1 r2Slice = r2(firstelement(i):lastelement(i)); mat(i,i+1:end) = r2Slice'; mat(i+1:end,i) = r2Slice; end
dgtucam12#
试试这个:
r2 = randi(10,24); r2 = (r2+r2')./2; % make matrix symmetric by adding transpose and divide by 2 r2 = r2 - diag(diag(r2)); % subtract diagonal matrix with diagonal from r2
2条答案
按热度按时间xiozqbni1#
你可以通过迭代行和列,粘贴r2的所需元素来获得空心矩阵。最简单的方法是跟踪你在r2中的位置。我相信如果你需要的话,可以用三角形数字直接计算r2Slice索引。
编辑:因为我无法把它从我的脑海中抹去,这里有一个直接计算指数的版本:
dgtucam12#
试试这个: