Question

Given a vector, A=[1,2,10,10,10,1], [m,k]=max(A) returns k=3. How to get the last index of the maximum element? In this example, I want to get 5.

The most succinct way I can think of is: [m,k]=max(A($:-1:1))

Is there a better way or does scilab provide a parameter to do this? Reversing a large vertex is not a good idea in any way.

Was it helpful?

Solution

Use the find command

You can use the find command to get all indices of the maximum:

indices = find(A==max(A))
last = max(indices)

Implement it yourself

Or if you want a single pass, you can implement it yourself:

//Create a c-function with your wanted behaviour
f1=['void max_array(int in_array[],int* in_num_elements,int *out_max, int *out_index)'
    '{' 
    'int i;'
    '*out_max=in_array[0];'
    '*out_index=-1;'
    'for (i=0; i<*in_num_elements; i++)'
    '{' 
        'if(in_array[i]>=*out_max)'
        '{'
             '*out_max=in_array[i];'
             '*out_index=i;'
        '}'
      '}'
 '}'];

//Place it in a file in the current directory
mputl(f1,'max_array.c')

//Create the shared library (a gateway, a Makefile and a loader are
//generated.
ilib_for_link('max_array','max_array.c',[],"c")

//Load the library
exec loader.sce

//Create wrapper for readability
function [m,k] = last_max(vector)
    [m, k] = call('max_array', vector, 1,'i', length(vector),2,'i', 'out',[1,1],3,'i',[1,1],4,'i');
    // Because c is zero-indexed add 1
    k = k + 1
endfunction

//Your data
A=[1,2,10,10,10,1];

//Call function on your data
[m,k] = last_max(A)
disp("Max value is " + string(m) + " at index " + string(k) )
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top