Extract only diagonal elements from matrix

400 Ansichten (letzte 30 Tage)
Will Bassett
Will Bassett am 26 Jan. 2021
Bearbeitet: Florian am 9 Nov. 2023
I have a matrix in one variable and a list of coordinates in another variable. Is there a way to extract only the matching pairs of coordinate from the matrix? I.e. X(1),Y(1); X(2), Y(2)...
I can extract all of the permutations (X1, Y1; X1 Y2 ...X2,Y1 ... etc) and then take the diagonal, but I was wondering if there was a simple solution I'm missing to only extract the matched pairs.
Thanks,
Will
%Data
mat = rand(100);
%Coordinates
x_coord = round(rand(10,1)*100);
y_coord = round(rand(10,1)*100);
%Extract coordinates
extracted_coord = diag(mat(x_coord,y_coord));

Akzeptierte Antwort

Image Analyst
Image Analyst am 26 Jan. 2021
You can do this, where m is your matrix, and v is the vector of extracted values from the x,y locations
v = zeros(1, length(X));
for k = 1 : length(X)
row = Y(k);
col = X(k);
v(k) = m(row, col);
end
Then just repeat with a scrambled x and y - I'm sure there is some function for that. Put the various v into a matrix and use eye() to extract the diagonal.
  3 Kommentare
Image Analyst
Image Analyst am 29 Jan. 2021
How long was it taking?
I did a million points and it took about 78 milliseconds. If I use 1000 points, it's 0.0003 seconds. Just how many points are you going to use, and what kind of speed do you require?
mat = rand(100);
[rows, columns] = size(mat)
numPoints = 1000000
X = ceil(rand(numPoints,1)*columns);
Y = ceil(rand(numPoints,1)*rows);
tic
v = zeros(1, length(X));
for k = 1 : length(X)
row = Y(k);
col = X(k);
v(k) = mat(row, col);
end
toc
Elapsed time is 0.078826 seconds.
Will Bassett
Will Bassett am 29 Jan. 2021
It was taking several seconds for me, but I was using a 2k x 2k matrix and the time consuming thing for that (in my testing) was generating the matrix. Pulling the actual points took about the same as yours. I think the speed is just fine this way.
This is much faster than making the full matrix and diagonalizing as I was doing before.
Thanks

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Florian
Florian am 9 Nov. 2023
Bearbeitet: Florian am 9 Nov. 2023
For a one line solution you can use linear indices via sub2ind:
v = mat(sub2ind(size(mat), 1:length(mat), 1:length(mat));
However i don't know about performance in comparison to the for-loop.

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