User1
User1

Reputation: 107

How to generalize Matlab function?

I have a Matlab function. I need to generalize this function. This code’s aim is to check this IndicMPs are in the TableTemp, if it is there, then we extract relevant age limits, such as: Age_Limite_DC, Age_Limite_IT, Age_Limite_Ch and Transfert_Prime_IT_DC. My idea is to generalize, passing parameters to find out the "Type_pret" is.(May be I'm wrong) Since I'm beginner to Matlab can someone help me to encode a more generic function that can be used in a more general context?

function Structure = optimisation_function()

Data = load('Data.mat');

Structure = Data.Structure;
TableTemp = Data.TableTemp;


Age_Limite_DC          = zeros(size(Structure,1),1);
Age_Limite_IT          = zeros(size(Structure,1),1);
Age_Limite_CH          = zeros(size(Structure,1),1);
Transfert_Prime_IT_DC  = zeros(size(Structure,1),1);

for IndexMPAL = 1 : length(Structure.AnneeSouscription)

    % Determine Type_Pret (Loan Type)
    if ~isempty(strfind(Structure.Type_Pret{IndexMPAL},'A'))
        Type_Pret = 'A';
    elseif ~isempty(strfind(Structure.Type_Pret{IndexMPAL},'B'))
        Type_Pret = 'B';
    elseif ~isempty(strfind(Structure.Type_Pret{IndexMPAL},'C'))
        Type_Pret = 'C';
    elseif ~isempty(strfind(Structure.Type_Pret{IndexMPAL},'D'))
        Type_Pret = 'D';
    elseif ~isempty(strfind(Structure.Type_Pret{IndexMPAL},'E'))
        Type_Pret = 'E';
    end
    MP_CP       = Structure.NomCodeProduit(IndexMPAL);
    MP_AnSous   = Structure.AnneeSouscription(IndexMPAL);
    MP_TypePret = Type_Pret;
    IndicCP     = strcmp(MP_CP, TableTemp.CodeProduit);
    IndicAS     = MP_AnSous== TableTemp.AnneeSouscription;
    IndicTP     = strcmp(MP_TypePret, TableTemp.TypePret);
    IndicMP     = IndicCP & IndicAS & IndicTP;        

    if ~any(IndicMP)
        Msg = strcat('CodeProduct:',MP_CP{1}, ', Année Souscription:', num2str(MP_AnSous), ', Type Prêt:', MP_TypePret);
        error('Error', Msg)
    else
        Age_Limite_DC(IndexMPAL,1) = TableTemp.Age_Limite_DC(IndicMP,1);
        Age_Limite_IT(IndexMPAL,1) = TableTemp.Age_Limite_IT(IndicMP,1);
        Age_Limite_CH(IndexMPAL,1) = TableTemp.Age_Limite_CH(IndicMP,1);
        Transfert_Prime_IT_DC(IndexMPAL,1)= 
        TableTemp.Transfert_Prime_IT_DC(IndicMP,1);
    end
end

Structure.Age_Limite_DC          = Age_Limite_DC;
Structure.Age_Limite_IT          = Age_Limite_IT;
Structure.Age_Limite_CH          = Age_Limite_CH;
Structure.Transfert_Prime_IT_DC  = Transfert_Prime_IT_DC;

end

Upvotes: 0

Views: 79

Answers (1)

Laure
Laure

Reputation: 373

The if/elseif can be simplified with a cell array:

liststr = {'A','BB','C','D','E'}; % builds a cell array, each cell contains a string
Positive_matches = strfind(liststr,Structure.Type_Pret{IndexMPAL}) % returns a list for each cell of the indices where the element was found (empty if none)
Index = find(~cellfun('isempty', Positive_matches )) % converts the previous list into a logical 0/1 array indicating whether an item was found (1) or not (0)
% if isempty(Index); continue; end % If no index is found, to avoid an error in the next instruction, skips the rest of the code. 
Type_Pret = liststr(Index(1));

If the Type_Pret are the same in your list and in Structure? , you can usestrcmp`:

liststr = {'A','B','C','D','E'};
if any(strcmp(Structure.Type_Pret,liststr))
    Type_Pret = Structure.Type_Pret
else
    % handle error
end

You can also work directly on Structure.Age_Limite_DC without using Age_Limite_DC.

Upvotes: 1

Related Questions