How do I create a vector array out of certain values of a matrix?

10 Ansichten (letzte 30 Tage)
Lakyn
Lakyn am 23 Aug. 2016
Kommentiert: Voss am 1 Jan. 2023
Hi all,
I have a 76x76 matrix, and I want to make the matrix into a vector array instead. But, the matrix is a symmetric matrix, and I only want the non repeated values. So basically, I only want the values from the top right triangle, excluding the diagonal line of value(which are all 1s). So something like i = (1:75), and j = (i+1:76). I am not too sure how to write this in a function though, so please help.
Thank you very much!

Antworten (2)

Guillaume
Guillaume am 23 Aug. 2016
The triu function can be used to create the logical matrix for the mask you want, so:
m = reshape(1:76*76, 76, 76); %demo matrix
m(triu(true(size(m)), 1))
  7 Kommentare
sai kumar s
sai kumar s am 31 Dez. 2022
along with the componenets in the upper triangular matrix i need diagonal componenets also. how can i extend the above code.
Voss
Voss am 1 Jan. 2023
@sai kumar s: As per the documentation that @Guillaume linked:
U = triu(X,k) returns the element on and above the kth diagonal of X
So, triu(X,0) returns all the elements above the main diagonal, with the main diagonal.
X = magic(6)
X = 6×6
35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11
triu(X,0)
ans = 6×6
35 1 6 26 19 24 0 32 7 21 23 25 0 0 2 22 27 20 0 0 0 17 10 15 0 0 0 0 14 16 0 0 0 0 0 11

Melden Sie sich an, um zu kommentieren.


Robert
Robert am 23 Aug. 2016
Using some example data, here is the code using logical indexing to grab all the values of the matrix whose column index is greater than its row index (upper triangle not including the diagonal).
n = 76;
x = magic(n);
[ii,jj] = meshgrid(1:n,1:n);
x(ii>jj)
  1 Kommentar
Guillaume
Guillaume am 23 Aug. 2016
Note that because you're using meshgrid instead of ndgrid, ii is actually the column indices, and jj the row indices. To make that clearer and avoid future bugs when the matrix is not square, I'd use:
[icols, irows] = meshgrid(1:size(x, 2), 1:size(x, 1));
%or
[irows, icols] = ndgrid(1:size(x, 1), 1:size(x, 2));
Or use triu to build the logical matrix directly.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Operating on Diagonal Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by