create a matrix of maximums

2 ビュー (過去 30 日間)
Miguel Albuquerque
Miguel Albuquerque 2022 年 7 月 5 日
編集済み: dpb 2022 年 7 月 5 日
Hey guys, thanks in advance,
I have this code that correlates in time two signals. The correlation is presented in a matrix(range_compressed_matrix) with 1960(time_compression_cut) x 400(waypoints).
This matrix has 400 columns, and each column is filled with 1960 values of a signal in time domain. So the x of this matrix is a position of a plane=1:400. And the y of this matrix is 1960 values of time. Which means that for each column, or position of a plane, I have a value among that 1960 values that is a maximum.
I want to get the values(xmax ,ymax) where the correlation is maximum for each column. Meaning that I will have a xmax=400(position of plane) and ymax=400(time).
In the end I want to save this two variables in two matrixes, I have this code, but I m not getting what I want, and dont know why.
[rows,columns]=size(range_compressed_matrix);
for col = 1 : columns
thisColumn = range_compressed_matrix(:, col);
maxValue = max(thisColumn(:));
[rows2, columns] = find(thisColumn == maxValue);
x_max(:,col) = waypoints(col);
y_max(rows,:) = time_compression_cut(rows2);
y_max(rows,:)= y_max(:,col)*c;
end
  3 件のコメント
Johan
Johan 2022 年 7 月 5 日
It's not very clear to me what you want to achieve here, a clearer explaination might help you and us solving your problem. I put some comments in the code snippets you shared:
%Random values
range_compressed_matrix = rand(1960,400);
waypoints = rand(400,1);
time_compression_cut = rand(1960,1);
[rows,columns]=size(range_compressed_matrix)
rows = 1960
columns = 400
c = 1;
for col = 1 : columns
thisColumn = range_compressed_matrix(:, col);
maxValue = max(thisColumn(:));
%You are setting columns as an output, its already used as your loop limit,
%moreover your not using that variable so you can replace it by ~
% [rows2, columns] = find(thisColumn == maxValue);
[rows2, ~] = find(thisColumn == maxValue);
%This is equivalent to x_max = waypoints'
x_max(:,col) = waypoints(col);
%rows = 1960 so this line sets the 1960 value of y_max to time_compression_cut(rows2);
y_max(rows,:) = time_compression_cut(rows2);
%y_max is single columned so this doesn't work
% y_max(rows,:)= y_max(:,col)*c;
end
all(x_max == waypoints')
ans = logical
1

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

採用された回答

Voss
Voss 2022 年 7 月 5 日
% get the maximum value of each column, along with the row it is located in
% (if multiple elements in a column are at the same maximum value, only the
% first occurrence of the maximum is stored):
[max_correlation, row_idx] = max(range_compressed_matrix, [], 1);
% store the values of time_compression_cut where the max values occur:
y_max = time_compression_cut(row_idx);
% store the value of waypoints for each column:
x_max = waypoints;

その他の回答 (2 件)

Rohit Kulkarni
Rohit Kulkarni 2022 年 7 月 5 日
To get maximum value for each column and the corresponding indices you can do the following:
max_values = max(range_compressed_matrix)
%idx will give logical indices
idx = (range_compressed_matrix == max_values)
[rows, cols] = find(idx)
  1 件のコメント
dpb
dpb 2022 年 7 月 5 日
More direct is simply
[max_values,rows] = max(range_compressed_matrix);
cols=1:size(range_compressed_matrix,2);
You've already searched the array once to find the maxima, why on earth search it again to locate what has already been located????
find is rarely needed; as here, when not needed specifically, it's just wasted motion.

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


dpb
dpb 2022 年 7 月 5 日
編集済み: dpb 2022 年 7 月 5 日
You didn't say there were values anywhere excepting in one column out of this array before -- you don't need no steenkin' loops here, either, max() is, like virtually all builtin MATLAB functions, vectorized and operates by column by default.
All you need is as I showed before is to return the optional second argument of max; here it'll give you the rows automagically because you're not looking for a global max across an entire array as in other...
Example:
>> r=rand(3,6) % some dummy data for your long-winded variable
r =
0.0020 0.3362 0.6381 0.7472 0.0574 0.7932
0.3105 0.5159 0.9211 0.7499 0.0476 0.4048
0.1045 0.7225 0.8400 0.2613 0.0946 0.0230
>> [mx,rmx]=max(r) % get maxima by column, row location
mx =
0.3105 0.7225 0.9211 0.7499 0.0946 0.7932
rmx =
2 3 2 2 3 1
>>
The column is simply 1:size(r,2) of course.
The other arrays(?) in your code are undefined; we've no way to know what to do with those.

タグ

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by