To get a sense of what I am trying to do: A = [1, 15200, 3, 5, 7; 15200, 15200, 15200, 7,0; 1,1,1,1, 15200; 9200, 1, 1,1,1]; [val] = max(A, [], 2); indices = find(A==val); [row, col] = ind2sub(size(A), indices); sub = [row, col]; Now sub is a array as such [ 1,2 ; 2,1 ; 2,2 ; 2,3 ; 3,5; 4,1 ] and I want that only one value with 2 in the first colomn is returned, but randomly and not only the 2,1 but sometimes 2,2 or 2,3. So the output of my code should be an array with either [ 1,2 ; 2,1 ; 3,5; 4,1 ] or [ 1,2 ; 2,2 ; 3,5; 4,1 ] or [ 1,2 ; 2,3 ; 3,5; 4,1 ]. The code should also do this if the value was not 2 so if I had a, array with [ 1,2 ; 3,1 ; 3,2 ; 3,3 ; 3,5; 4,1 ] it would return only one value for 3 in the first column. The idea is that I select 1 of the maximum values in the rows in the A-array, but not always the first one.
Kshitij Singh answered .
2025-11-20
Here's another way, with no loops
% Example data matrix % I modified this a little from your example to have % multiple occurences of row maximum in the 5th row also, to give better % illustration A = [1, 15200, 3, 5, 7; 15200, 15200, 15200, 7,0; 1,1,1,1, 15200; 9200, 1, 9200,1,1]; % get array dimension for later use numRows = size(A,1); % Find the row maximums rowMax = max(A,[],2); % Mark locations where row maximums occur isRowMax = A == rowMax; % Make matrix with random values wherever row maximums occur and zero % everywhere else S = isRowMax.*rand(size(A)); % Select random column amongst occurrences of row maximums % (column where largest element in S occurs is random) [~,selectedColumn] = max(S,[],2); % Return row and column indices for location of maximum in each row sub = [(1:numRows)' selectedColumn]
sub = 4×2
1 2
2 2
3 5
4 1