Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [A,B] = Finn(b,varargin)
- A = 0; H = 0;
- % Sjekker hvor mange lister en søker i
- % Mer enn 3, eller mindre enn 2 variabler avslutter
- if isempty(b)
- return;
- end
- if nargin == 2 || isequal(varargin{1},varargin{2})
- a = lower(varargin{1}); La = length(a);
- d = '';
- H = 2;
- if ~iscellstr(a)
- return
- end
- elseif nargin == 3
- a = lower(varargin{1}); La = length(a);
- d = lower(varargin{2}); Ld = length(d);
- if La ~= Ld || ~iscellstr(a) || ~iscellstr(d)
- return
- end
- a = regexprep(a,'[^a-zA-ZæøåÆØÅ]','');
- H = 3;
- else
- return
- end
- % Tester om input er en streng, så deles denne opp
- % og lagres i en liste
- K=0;
- if isa(b,'char')
- % Deler opp strengen på komma
- if sum(b == ',')~=0
- c = regexp(b, ',', 'split');
- % Beholder bare de unike strengene i b
- if length(c) > length(unique(c));
- [~,p,~] = unique(c,'first');
- c = c(sort(p));
- end
- B = c;
- else
- % Hvis b bare en en enkelt streng sjekkes denne raskt
- if iscellstr(a)
- b = regexprep(b,'[^a-zA-ZæøåÆØÅ]','');
- K = strcmpi(b,a) + strcmpi(b,d);
- if sum(K>0)
- u = 1:length(a);
- t = u(K>0);
- A = t(1);
- B = 0;
- end
- c = {b};
- end
- return
- end
- elseif isa(b,'cell') && ~isempty(b{:})
- c = b; B = c;
- else
- return
- end
- Lc = 1:length(c); LB = 1:length(B);
- c = regexprep(lower(c)','[^a-zA-ZæøåÆØÅ]','');
- if H==2
- [~,w2] = ismember(c,a)
- A = w2; A = A';
- B = B(w2==0);
- else
- d = regexprep(lower(d),'[^a-zA-ZæøåÆØÅ]',''); u = 1:length(d);
- [~,d2] = ismember(c,a)
- A = d2; numel(c);
- if length(d2(d2>0))<numel(c)
- [c1,~] = ismember(c,d(d2(d2>0))); C=A;
- B(c1>0)=[]; Lc(c1>0)=[]; C(c1>0)=[]; LB(c1>0)=[]; B = B(C==0); LB=LB(C==0);
- if ~isempty(B)
- T = regexprep(lower(B)','[^a-zA-ZæøåÆØÅ]','');
- d(d2(d2>0))=[]; u(d2(d2>0))=[];
- [~,d3] = ismember(T,d);
- B = B(d3==0);
- A(LB(d3>0)) = u(d3(d3>0));
- end
- else
- B = 0;
- end
- A = A';
- end
- if numel(B)>0
- T = regexprep(lower(B)','[^a-zA-ZæøåÆØÅ]','');
- [~, q2] = ismember(T,c);
- for j = 1:numel(T)
- i = 1;
- if H == 2
- while i <= length(a) && A(q2(j)) == 0
- if compare(a{i},T{j})==1
- A(q2(j)) = i;
- B(i) = [];
- else
- i = i + 1;
- end
- end
- else
- while i <= length(a) && A(q2(j)) == 0
- if compare(a{i},T{j})==1
- A(q2(j)) = i;
- elseif H ~= 2
- if compare(d{i},T{j})==1
- A(q2(j)) = i;
- B(i) = [];
- end
- else
- i = i + 1;
- end
- end
- end
- end
- end
- end
- function Y = compare(str1,str2)
- Y = 0;
- % Tester om lengden mellom strengene er større enn 1
- if abs(length(str2)-length(str1))>1
- return
- elseif strcmpi(str1,str2)
- Y = 1;
- return
- end
- L1=length(str1)+1;
- L2=length(str2)+1;
- L=zeros(L1,L2);
- g=+1;%just constant
- m=+0;%match is cheaper, we seek to minimize
- d=+1;%not-a-match is more costly.
- %do BC's
- L(:,1)=([0:L1-1]*g)';
- L(1,:)=[0:L2-1]*g;
- %loop invariant
- for idx=2:L1;
- for idy=2:L2
- if(str1(idx-1)==str2(idy-1))
- score=m;
- else
- score=d;
- end
- m1=L(idx-1,idy-1) + score;
- m2=L(idx-1,idy) + g;
- m3=L(idx,idy-1) + g;
- L(idx,idy)=min(m1,min(m2,m3));
- if L(L1,L2)>1
- return
- end
- end
- end
- Y=1;
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement