Extract only diagonal elements from matrix

400 ビュー (過去 30 日間)
Will Bassett
Will Bassett 2021 年 1 月 26 日
編集済み: Florian 2023 年 11 月 9 日
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));

採用された回答

Image Analyst
Image Analyst 2021 年 1 月 26 日
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 件のコメント
Image Analyst
Image Analyst 2021 年 1 月 29 日
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 2021 年 1 月 29 日
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

サインインしてコメントする。

その他の回答 (1 件)

Florian
Florian 2023 年 11 月 9 日
編集済み: Florian 2023 年 11 月 9 日
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.

カテゴリ

Help Center および File ExchangeOperating on Diagonal Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by