I have to switch the max and min elements in a vector and assume vec = ceil(rand(1, 10)*100) is a vector containing 10 random generated integers. The script i have to provide will swap the maximum and the minimum element in the vector.
    3 views (last 30 days)
  
       Show older comments
    
I don't even know where to start, any help? Example: vec=[ 16 98 96 49 81 15 43 92 80 96], you script will result in vec = [ 16 15 96 49 81 98 43 92 80 96]
Answers (3)
  ANKUR KUMAR
      
 on 28 Sep 2018
        
      Edited: ANKUR KUMAR
      
 on 28 Sep 2018
  
      Firstly, please follow Walter Roberson's comment.
   A=[ 16 98 96 49 81 15 43 92 80 96]
  A([find(A==min(A)),find(A==max(A))])=ones(1,length(find(A==min(A))))*max(A),ones(1,length(find(A==max(A))))*min(A)]
5 Comments
  ANKUR KUMAR
      
 on 28 Sep 2018
				Oh sorry. I forgot to take this into consideration. This will work.
A = [1, 3, 2, 1, 10]
A([find(A==min(A)),find(A==max(A))])=[ones(1,length(find(A==min(A))))*max(A),ones(1,length(find(A==max(A))))*min(A)]
  Bruno Luong
      
      
 on 28 Sep 2018
        Solution for the problem of "swapping" ties min-values with ties max-values
minA = min(A);
maxA = max(A);
ismax = A==maxA;
A(A==minA) = maxA;
A(ismax) = minA;
  Stephen23
      
      
 on 28 Sep 2018
        
      Edited: Stephen23
      
      
 on 28 Sep 2018
  
      Even though this is homework without any attempt... here is a neat and efficient MATLAB way to do that (this swaps the first minimum and the first maximum):
>> vec = [16,98,96,49,81,15,43,92,80,96]
vec =
   16   98   96   49   81   15   43   92   80   96
>> [~,idn] = min(vec);
>> [~,idx] = max(vec);
>> vec([idn,idx]) = vec([idx,idn])
vec =
   16   15   96   49   81   98   43   92   80   96
Of course you cannot hand this in as your own work, because that would be plagiarism.
3 Comments
  Bruno Luong
      
      
 on 28 Sep 2018
				
      Edited: Bruno Luong
      
      
 on 28 Sep 2018
  
			But your (Ankur's) code and Stephen's code do not perform the same arrangement in the case of tie. And poster never specify which one he actually needs.
  Stephen23
      
      
 on 28 Sep 2018
				
      Edited: Stephen23
      
      
 on 28 Sep 2018
  
			Swap all tied maximum/minimum values:
>> vec = [15,16,96,96,49,81,15,43,92,80,96]
vec =
   15   16   96   96   49   81   15   43   92   80   96
>> idn = find(min(vec)==vec);
>> idx = find(max(vec)==vec);
>> vec([idn,idx]) = vec([idx(1)*ones(1,numel(idn)),idn(1)*ones(1,numel(idx))])
vec =
   96   16   15   15   49   81   96   43   92   80   15
See Also
Categories
				Find more on Logical in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!