Code covered by the BSD License  

Highlights from
matlab2fmex

image thumbnail

matlab2fmex

by

 

03 Feb 2004 (Updated )

matlab2fmex.m is a small translator which aims to convert numerical M-files to Fortran90 mex.

Editor's Notes:

This author's upload was somehow corrupted. We fixed this on March 29, 2006. At that time, we also converted it from a GZ file a ZIP file for better cross platform portability.

[tempval]=determineshape(howmany,subscripts,centercomma,parens,i,j,whichsub);
function [tempval]=determineshape(howmany,subscripts,centercomma,parens,i,j,whichsub);
declare_globals
tempstr=''; %default
tempval=cell(1); %default

instr=subscripts{whichsub};
%Find which words and numbers are in this subscript
if howmany==1
 if isinf(j)
  start=parens(1);            finish=parens(2);
  [outflag,howmany3,subscripts3,centercomma3,parens]=inwhichlast(i,parens(1));
 else
  start=parens(1);           finish=parens(2);
 end
 nums=find((funstrnumbers_b{i}>=start)&(funstrnumbers_b{i}<=finish));
 words=find((funstrwords_b{i}>=start)&(funstrwords_b{i}<=finish));
else
 if whichsub==1
  start=parens(1);          finish=centercomma(1);
 elseif whichsub==howmany
  start=centercomma(whichsub-1);   finish=parens(2);
 else
  start=centercomma(whichsub-1);   finish=centercomma(whichsub);
 end
 nums=find((funstrnumbers_b{i}>=start)&(funstrnumbers_b{i}<=finish));
 words=find((funstrwords_b{i}>=start)&(funstrwords_b{i}<=finish));
end
%Run through words. Discard any that are fortran only words.
%'detttttttttttt',funstr{i}
tempval=inf;evalstr='';
if length(words)==0 %Have only numbers. Should be ready for evaluation
 evalstr=instr;
 tempval=eval(evalstr);
else
 %'nowwwwwwwwww',kb
 last=funstrwords_b{i}(words(1))-1;
 evalstr=funstr{i}(start+1:last);
 for m=1:length(words)
  if any(strcmp(funstrwords{i}{words(m)},funwords))
   evalstr=[evalstr,funstr{i}(last+1:funstrwords_e{i}(words(m)))];
   last=funstrwords_e{i}(words(m));
  elseif any(strcmp(funstrwords{i}{words(m)},inoutother3))
   evalstr=[evalstr,funstr{i}(last+1:funstrwords_b{i}(words(m))-1),'cw.',funstrwords{i}{words(m)}];
   last=funstrwords_e{i}(words(m));
  else
   evalstr=[evalstr,funstr{i}(last+1:funstrwords_b{i}(words(m))-1)];
   last=funstrwords_e{i}(words(m));
  end
 end
 evalstr=[evalstr,funstr{i}(last+1:finish-1)];
 try
  tempval=eval(evalstr);
 catch
  tempval=nan;
 end
end
%evalstr,tempval
%'detttttttttttt',funstr{i},tempval,kb




%'got',funstr{i},funstr1{ss},subscripts,howmany,k,evalstr,tempstr,kb



%First map the current word into the old word if need be.
% map={'minval','min';'maxval','max';'product','prod'};
% temp3=[];
% ss=zeros(length(funstr1),1);
% ss=ones(length(funstr1),1);
% %Use of map to find the right line
% %if strcmp(funstrwords{i}{j},'length')
% % 'sssssssssssssssssss',funstr{i},kb
% %end
% thisword=funstrwords{i}{j};
% if any(strcmp(funstrwords{i}{j},{map{:}}))
%  [temp3(1),temp3(2)]=find(strcmp(funstrwords{i}{j},map));
% end
% %Map this i,j to the original set, then determine
% if ~isempty(temp3)
%  temp1=nnz([find(strcmp(map{temp3(1),1},funstrwords{i})|strcmp(map{temp3(1),2},funstrwords{i}))]);
% else
%  temp1=nnz([find(strcmp(thisword,funstrwords{i}))]);
% end
% for k=1:length(funstr1) %Find lines in funstr1 that have the same number of thisword or orig word
%  if isempty(temp3)
%   temp=nnz([find(strcmp(thisword,funstrwords1{k}))]);
%  else
%   temp=nnz([find(strcmp(map{temp3(1),2},funstrwords1{k}))]);
%  end
%  if temp==temp1
%   ss(k)=1;
%  end
% end
% for k=1:length(funstr1) 
%  %find lines in funstr1 which has all the same vars in the right order in funstr{i}
%  if ss(k)
%   last=0;keepit=1;
%   for m=1:length(funstrwords1{k})
%    if keepit
%     if any(strcmp(funstrwords1{k}{m},inoutother3)) %Got a variable
%      ;%Where's the occurrences of this var in funstrwords{i}
%      temp2=find(strcmp(funstrwords1{k}{m},funstrwords{i}));
%      if ~isempty(temp2)
%       temp2=temp2(temp2>last); %only consider vars after the last find
%       if ~isempty(temp2)
%        last=temp2(1);
%       else %Couldn't find funstrwords1{ss}{m} in funstrwords{i} past the last one
%        keepit=0;
%       end
%      else %Couldn't find funstrwords1{ss}{m} in funstrwords{i}
%       keepit=0;
%      end
%     end
%    end
%   end
%   if keepit==0
%    ss(k)=0;
%   end
%  end
% end
% ss=find(ss);
% %Closest line earlier in funstr1 which is still active is the winner
% ss=ss(ss<=i);
% ss=ss(end);
% temp=find(funstrwords_b{i}==funstrwords_b{i}(j));
% if isempty(temp3)
%  temp1=find(strcmp(funstrwords{i},thisword));
% else
%  temp1=find(strcmp(map{temp3(1),1},funstrwords{i})|strcmp(map{temp3(1),2},funstrwords{i}));
% end
% temp2=find(temp==temp1);
% if isempty(temp3)
%  temp=find(strcmp(funstrwords1{ss},thisword));
% else
%  temp=find(strcmp(funstrwords1{ss},map{temp3(1),2}));
% end
% temp=temp(temp2);
% 
% %Now we are ready to get subscripts from funstrwords1{ss}{temp}
% [howmany,subscripts,centercomma,parens]=hassubscript(ss,temp,funstr1,funstrwords_e1);

Contact us