how to make symmetric matrix with vector of its non repeated elements?
    5 ビュー (過去 30 日間)
  
       古いコメントを表示
    
suppose we have non repeated elements of a matrix in a vector . I need to make a symmetric matrix by using this vector in matlab.
for example if we have :
v= [ 1 4 5 6 9 0]
the answer must be the matrix:  
      1    4     5 
      4    6     9
      5      9    0
採用された回答
  Jan
      
      
 2023 年 3 月 1 日
        
      編集済み: Jan
      
      
 2023 年 3 月 1 日
  
      v = [1 4 5 6 9 0];
d = numel(v);
n = (sqrt(8 * d + 1) - 1) / 2;  % Number of rows and colums
A = zeros(n, n);
A(tril(true(n, n))) = v;
A(triu(true(n, n))) = v   % [EDITED, faster than transposing the mask]
Or with a loop (assumably faster for large arrays):
k = 0;
A = zeros(n, n);
for i2 = 1:n
    k         = k + 1;     % Diagonal element
    A(i2, i2) = v(k);    
    for i1 = i2 + 1:n      % Below and above diagonal
        k         = k + 1;
        A(i1, i2) = v(k);
        A(i2, i1) = v(k);
    end
end
A
3 件のコメント
  Isabelle Davies
 2025 年 6 月 1 日
				Heads up: The first method does not return the correct symmetric matrix A, as the elements in row 2, column 2 and row 1, column 3 have been switched. 
  Stephen23
      
      
 2025 年 6 月 1 日
				
      編集済み: Stephen23
      
      
 2025 年 6 月 1 日
  
			@Isabelle Davies: you are right.
It is because the order of the elements in v are not suitable for allocating into the upper triangle.
One solution:
v = [1,4,5,6,9,0];
n = (sqrt(8*numel(v)+1)-1)/2; % must be whole
A = zeros(n,n);
A(tril(~A)) = v;
A = A+triu(A.',1)
その他の回答 (1 件)
  Pratheek
    
 2023 年 3 月 1 日
        The first line of the code is to input for the size of the matrix that you want to generate.  
% ask the user for the size of the matrix
n = input('Enter the size of the square matrix: ');
% get the input vector
v = [1 4 5 6 9 0]; % or prompt the user to enter the vector as well
% create the symmetric matrix
M = zeros(n);
k = 1;
for i = 1:n
    for j = (i+1):n
        M(i,j) = v(k);
        M(j,i) = v(k);
        M(i,i) = v(randi(length(v)));
        k = k + 1;
    end
end
% display the resulting matrix
disp(M);
1 件のコメント
  Jan
      
      
 2023 年 3 月 1 日
				Why do you set the diagonal elements randomly and repeatedly in each iteration of the inner loop?
参考
カテゴリ
				Help Center および File Exchange で Operating on Diagonal Matrices についてさらに検索
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





