create a matrix of maximums

3 views (last 30 days)
Miguel Albuquerque
Miguel Albuquerque on 5 Jul 2022
Edited: dpb on 5 Jul 2022
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 Comments
Johan
Johan on 5 Jul 2022
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

Sign in to comment.

Accepted Answer

Voss
Voss on 5 Jul 2022
% 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;

More Answers (2)

Rohit Kulkarni
Rohit Kulkarni on 5 Jul 2022
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 Comment
dpb
dpb on 5 Jul 2022
Edited: dpb on 5 Jul 2022
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.

Sign in to comment.


dpb
dpb on 5 Jul 2022
Edited: dpb on 5 Jul 2022
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.

Categories

Find more on Coordinate Transformations and Trajectories in Help Center and File Exchange

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!