在Matlab中将向量转换为对称空心矩阵

sqserrrh  于 2023-01-31  发布在  Matlab
关注(0)|答案(2)|浏览(254)

我想把一个向量转换成一个对称的空心矩阵,但我不是很熟悉Matlab。
例如:
r2 = randi(10,276,1);

并将其转换为对称空矩阵,即关于零对角线的对称矩阵(见下图)。输出矩阵应为24x24(276 + 276 + 24(零))

谢谢你的帮忙!

xiozqbni

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
dgtucam1

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

相关问题