0001 function [X,FULLFMT] = saveascii(X,varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 if nargin<1
0178 error('CVARGAS:saveascii:notEnoughInputs',...
0179 'At least 1 input is required.')
0180 elseif nargin>5
0181 error('CVARGAS:saveascii:tooManyInputs',...
0182 'At most 5 inputs are allowed.')
0183 elseif nargout>2
0184 error('CVARGAS:saveascii:tooManyOutputs',...
0185 'At most 2 outputs are allowed.')
0186 end
0187
0188
0189 FILE = [];
0190
0191
0192 PER = 'w';
0193
0194
0195 TOB = 't';
0196
0197
0198 WAR = false;
0199
0200
0201 if ischar(X) ||...
0202 iscellstr(X)
0203 FMT = {'%c'};
0204 DLM = {''};
0205 else
0206 FMT = {'% 8.7e'};
0207 DLM = {' '};
0208 end
0209 BOEL = '';
0210 EOEL = '\n';
0211
0212
0213 PRE = [];
0214 WID = [];
0215 SPC = 'f';
0216
0217
0218
0219
0220 Nrow = size(X);
0221 if length(Nrow)>2
0222 error('CVARGAS:saveascii:incorrectXDimension',...
0223 'X must be a 2-dimensional matrix array.')
0224 else
0225 Ncol = Nrow(2);
0226 Nrow = Nrow(1);
0227 end
0228
0229 Xemp = isempty(X);
0230 Xnum = false;
0231 Xcell = false;
0232 if ~Xemp && (isnumeric(X) || islogical(X))
0233 if ~isreal(X)
0234 warning('CVARGAS:saveacii:complexInput',...
0235 'Imaginary parts on X were ignored.')
0236 X = real(X);
0237 end
0238 Xnum = true;
0239 elseif ischar(X)
0240
0241 elseif iscellstr(X)
0242 Xcell = true;
0243 if Ncol>1
0244 if Nrow~=1
0245 error('CVARGAS:saveascii:incorrectXCellSize',...
0246 'X must be a vector of cell of strings, not a matrix.')
0247 end
0248 Nrow = Ncol;
0249 Ncol = 1;
0250 end
0251 X = X(:);
0252 Ncolcell = cellfun(@length,X);
0253 if Nrow==1
0254
0255 X = X{1};
0256 Xcell = false;
0257 end
0258 elseif ~Xemp
0259 error('CVARGAS:saveascii:incorrectXType',...
0260 'X must be numerical, logical, string or cell of strings type.')
0261 end
0262
0263
0264
0265
0266 Nopt = length(varargin);
0267 inum = false(1,Nopt);
0268 ichar = inum;
0269 icell = inum;
0270 iempty = inum;
0271 for k = 1:Nopt
0272 if isempty(varargin{k})
0273 iempty(k) = true;
0274 elseif ischar(varargin{k})
0275 ichar(k) = true;
0276 elseif iscellstr(varargin{k})
0277 icell(k) = true;
0278 elseif isnumeric(varargin{k})
0279 inum(k) = true;
0280 else
0281 error('CVARGAS:saveascii:incorrectTypeInput',...
0282 'Optional inputs must be numerical, char or cell of strings type.')
0283 end
0284 end
0285
0286
0287 [newFILE,PRE] = get_num(PRE,Ncol,varargin(inum),find(inum),find(iempty));
0288 clear inum iempty
0289
0290
0291 newFMT = [];
0292 if Xnum
0293
0294
0295 if ~isempty(PRE)
0296
0297
0298 ind = (PRE<0);
0299 if any(ind)
0300
0301 if length(PRE)==1
0302 temp = 10^PRE;
0303 X = round(X*temp)/temp;
0304 else
0305 temp = repmat(10.^PRE(ind),Nrow,1);
0306 X(:,ind) = round(X(:,ind).*temp)./temp;
0307 end
0308 clear temp
0309 PRE(ind) = 0;
0310 end
0311 if any(~ind)
0312
0313 if length(PRE)==1
0314 temp = 10^PRE;
0315 X = round(X*temp)/temp;
0316 else
0317 temp = repmat(10.^PRE(~ind),Nrow,1);
0318 X(:,~ind) = round(X(:,~ind).*temp)./temp;
0319 end
0320 clear temp
0321 end
0322 X(X==0) = 0;
0323
0324
0325
0326
0327
0328
0329
0330 iinf = ~isfinite(X);
0331 iinfn = find(iinf);
0332 iinfn(isnan(X(iinfn)) ) = [];
0333 iinfn( X(iinfn)>0) = [];
0334 iinf = double(iinf);
0335 iinf(iinfn) = -1;
0336 x3 = [maxinf(X,[],1); any(iinf,1)-2*any(iinf<0,1); mininf(X,[],1)];
0337 clear iinf iinfn
0338
0339 newFMT = pre2fmt(PRE,WID,SPC,Ncol,x3);
0340 clear x3
0341 end
0342 else
0343 if ~isempty(PRE)
0344 error('CVARGAS:saveascii:incorrectFmtNumericalInput',...
0345 'FMT cannot be numerical because X is not numeric.')
0346 end
0347 end
0348
0349
0350 [newDLM,newFMT,EOEL,full1] = ...
0351 get_cell([],newFMT,EOEL,Ncol,varargin(icell));
0352 clear icell
0353
0354
0355
0356 [newFILE,PER,TOB,WAR,newDLM,newFMT,EOEL,full2] = get_char(newFILE,PER,...
0357 TOB,WAR,newDLM,newFMT,EOEL,Ncol,varargin(ichar),find(ichar));
0358 clear ichar varargin
0359
0360
0361
0362 if ~isempty(newFMT)
0363 if ~Xnum
0364 warning('CVARGAS:saveascii:incorrectFmtCharInput',...
0365 'Ignored specific format because X is char.')
0366 else
0367 FMT = newFMT;
0368 end
0369 end
0370
0371
0372 if ~isempty(newDLM)
0373 if full1 || full2
0374 warning('CVARGAS:saveascii:ignoredDlmInput',...
0375 'DLM ignored because FMT is a full format.')
0376 DLM = {''};
0377 else
0378 DLM = newDLM;
0379 end
0380 end
0381
0382
0383 if ~Xemp
0384 if ~Xcell
0385 FULLFMT = [BOEL get_strform(DLM,FMT,Ncol) EOEL];
0386 else
0387 FULLFMT = cell(Nrow,1);
0388 eoel = EOEL;
0389 if ~isempty(EOEL)
0390 for k = 1:2
0391 if strcmp(eoel(end-1:end),'\n')
0392 eoel(end-1:end) = [];
0393 elseif strcmp(eoel(end-1:end),'\r')
0394 eoel(end-1:end) = [];
0395 end
0396 if isempty(eoel), break, end
0397 end
0398 elseif length(FMT)>1
0399 for k = 1:2
0400 if isempty(FMT), break, end
0401 if strcmp(FMT(end-1:end),'\n')
0402 EOEL = FMT(end-1:end);
0403 FMT(end-1:end) = [];
0404 elseif strcmp(FMT(end-1:end),'\r')
0405 EOEL = FMT(end-1:end);
0406 FMT(end-1:end) = [];
0407 end
0408 end
0409 end
0410 for k = 1:Nrow
0411 FULLFMT{k} = [BOEL get_strform(DLM,FMT,Ncolcell(k)) eoel];
0412 end
0413 end
0414 else
0415
0416 X = '';
0417 FULLFMT = '';
0418 end
0419 clear BOEL WID FMT DLM SPC Ncol
0420
0421
0422
0423 if ~isempty(newFILE)
0424 FILE = newFILE;
0425
0426
0427 if isempty(PRE) && isempty(newFMT) && isnumeric(FILE)
0428 if ~isempty(fopen(FILE))
0429 warning('CVARGAS:saveascii:usedFileNumericalInput',...
0430 'Filename used was ''%s'' with file identifier %.0f.',fopen(FILE),FILE)
0431
0432
0433
0434 else
0435 error('CVARGAS:saveascii:invalidNumericalSecondInput',...
0436 ['Numerical second input must be a valid File Identifier. If it is '...
0437 'PRECISION, give an empty, [], as second input.'])
0438 end
0439 end
0440 end
0441 if ~isempty(FILE) && isnumeric(FILE)
0442
0443 fid = FILE;
0444 [FILE,per] = fopen(fid);
0445 if ~ismember(per(1),'aAwW')
0446 error('CVARGAS:saveascii:noWrittingPermission',...
0447 ['Filename ''%s'' with file identifier %.0f does not have writting ' ...
0448 'permision. See FOPEN for details.'],fopen(FILE),FILE)
0449 end
0450 if Xcell && ~ismember(per(1),'aA')
0451 error('CVARGAS:saveascii:noAppendPermission',...
0452 ['Filename ''%s'' with file identifier %.0f does not have append ' ...
0453 'permision. Elements of cell X will overwrite the file each time.']...
0454 ,fopen(FILE),FILE)
0455 end
0456 else
0457 fid = [];
0458 end
0459 Femp = isempty(FILE);
0460 if (~Femp && WAR) && ((isempty(fileparts(FILE)) && ...
0461 (exist(fullfile(pwd,FILE),'file')==2)) || (exist(FILE,'file')==2))
0462
0463 h = questdlg({'Is it OK to overwrite the file:'; [FILE '?']},...
0464 'saveascii.m','Yes','Cancel','Cancel');
0465 if isempty(h) || ~strcmp(h,'Yes')
0466 if nargout==0
0467 clear X
0468 return
0469 end
0470 Femp = true;
0471 end
0472 end
0473 clear newFILE
0474 clear newFMT
0475
0476
0477
0478
0479
0480
0481
0482 if ~Femp
0483
0484 if ~isempty(fid)
0485 if ~Xcell
0486 fprintf(fid,FULLFMT,X.');
0487 else
0488 for k = 1:Nrow
0489 fprintf(fid,FULLFMT{k},X{k}.');
0490 end
0491 end
0492 else
0493
0494 [DIR FILE EXT] = fileparts(FILE);
0495 if ~isempty(DIR)
0496 if ~(exist(DIR,'dir')==7)
0497 [flag,temp] = mkdir(DIR);
0498 if ~flag
0499 error('CVARGAS:saveascii:invalidDirectoryName',...
0500 'Unable to create the output directory ''%s''.',DIR)
0501 end
0502 end
0503 end
0504 FILE = fullfile(DIR,[FILE EXT]);
0505 fid = fopen(FILE,[PER TOB]);
0506 if fid<0
0507 error('CVARGAS:incorrectFileStringInput',...
0508 ['FILE was not a valid file name. If it is a DELIMITER put it ' ...
0509 'between brackets, {}, or put an empty, [], in the second input.'])
0510 end
0511 if ~Xcell
0512 fprintf(fid,FULLFMT,X.');
0513 fclose(fid);
0514 else
0515
0516 fprintf(fid,[FULLFMT{1} EOEL],X{1}.');
0517 fclose(fid);
0518 fid = fopen(FILE,['a' TOB]);
0519 for k = 2:Nrow
0520 fprintf(fid,[FULLFMT{k} EOEL],X{k}.');
0521 end
0522 fclose(fid);
0523 end
0524 end
0525 if (nargout==0)
0526 clear X
0527 return
0528 end
0529 end
0530
0531
0532 if nargout==0
0533 if ~Xcell
0534
0535 if ~Xnum && (Xemp || isempty(newDLM))
0536 disp(X)
0537 clear X
0538 return
0539 end
0540 X = sprintf(FULLFMT,X.');
0541 if isempty(X)
0542
0543 error('CVARGAS:saveascii:incorrectFormat',...
0544 'Incorrect format.')
0545 end
0546 Ncol2 = numel(X)/Nrow;
0547 if isnatural(Ncol2)
0548 Y = reshape(X,Ncol2,Nrow);
0549 Yn = double(Y(end,1));
0550 if all(Yn==double(sprintf(FULLFMT(end-1:end))))
0551 Y = Y(1:end-1,:)';
0552 X = Y;
0553 else
0554 warning('CVARGAS:saveascii:matrixNotSquare',...
0555 ['The displayed string matrix is a vector because the array ' ...
0556 'cannot be squared with this format.'])
0557
0558
0559
0560 end
0561 elseif ~isempty(X)
0562 warning('CVARGAS:saveascii:matrixNotSquare',...
0563 ['The displayed string matrix is a vector because the array ' ...
0564 'cannot be squared with this format.'])
0565
0566
0567
0568 end
0569 disp(X)
0570 else
0571 for k = 1:Nrow
0572 fprintf(1,[FULLFMT{k} EOEL],X{k}.')
0573 end
0574 end
0575 clear X
0576 return
0577 end
0578
0579
0580
0581
0582
0583
0584
0585 if ~Xnum && (Xemp || (isempty(newDLM) && ~Xcell))
0586 return
0587 end
0588
0589
0590 if ~Xcell
0591 X = sprintf(FULLFMT,X.');
0592 Ncol2 = numel(X)/Nrow;
0593 if isnatural(Ncol2)
0594 Y = reshape(X,Ncol2,Nrow);
0595 Yn = double(Y(end,1));
0596 if all(Yn==double(sprintf(FULLFMT(end-1:end))))
0597 Y = Y(1:end-1,:)';
0598 X = Y;
0599 else
0600 warning('CVARGAS:saveascii:matrixNotSquare',...
0601 ['The displayed string matrix is a vector because the array ' ...
0602 'cannot be squared with this format.'])
0603
0604
0605
0606 end
0607 elseif ~isempty(X)
0608 warning('CVARGAS:saveascii:matrixNotSquare',...
0609 ['The output string matrix is a vector because the array ' ...
0610 'cannot be squared with this format.'])
0611
0612
0613
0614 end
0615 else
0616 Y = cell(Nrow,1);
0617 for k = 1:Nrow
0618 Y{k} = sprintf(FULLFMT{k},X{1}.');
0619 X(1) = [];
0620 end
0621 Mcolcell = cellfun(@length,Y);
0622 X = repmat(' ',Nrow,max(Mcolcell));
0623 for k = 1:Nrow
0624 X(k,1:Mcolcell(k)) = Y{1};
0625 Y(1) = [];
0626 end
0627 end
0628
0629
0630
0631
0632
0633
0634 function [fid,PRE] = get_num(PRE,Ncol,numopt,inum,iempty)
0635
0636
0637
0638
0639 PRE = round(PRE(:).');
0640 fid = [];
0641
0642
0643 if isempty(numopt)
0644 return
0645 end
0646
0647
0648
0649 if isempty(iempty) && inum(1)==1 && (numel(numopt{1})==1) && ...
0650 (numopt{1}>0) && isnatural(numopt{1}) && ~isempty(fopen(numopt{1}))
0651 fid = numopt{1};
0652 numopt(1) = [];
0653 if isempty(numopt)
0654 return
0655 end
0656 end
0657
0658
0659 if Ncol==0
0660 return
0661 end
0662
0663
0664 if length(numopt)>1
0665 error('CVARGAS:saveascii:tooManyFmtInput',...
0666 'More than one FMT precision given.')
0667 end
0668
0669 if any(~isfinite(numopt{1}))
0670 error('CVARGAS:saveascii:notFiniteFmtInput',...
0671 'Precision FMT must be all finite.')
0672 end
0673
0674 nPRE = numel(numopt{1});
0675 if (nPRE~=1) && (nPRE~=Ncol)
0676 error('CVARGAS:saveascii:incorrectFmtLongInput',...
0677 'Precision FMT vector must have 1 or Ncol integers.')
0678 end
0679
0680 if any(~isnatural(numopt{1}))
0681 error('CVARGAS:saveascii:notIntegerFmtInput',...
0682 'Precision FMT must be integers.')
0683 end
0684
0685 PRE = numopt{1}(:).';
0686
0687 function FMT = pre2fmt(PRE,WID,SPC,Ncol,x3)
0688
0689
0690
0691
0692 if length(PRE)==1
0693 x3 = [max(x3(1,:)); any(x3(2,:),2)-2*any(x3(2,:)<0,2); min(x3(3,:))];
0694 end
0695 if isempty(WID)
0696 WID = get_wid(PRE,x3([1 3],:));
0697
0698 isbad = logical(x3(2,:));
0699 isbad(isbad) = (WID(isbad)<=3);
0700 WID(isbad) = 3 + any(x3(2,isbad)<0,1);
0701
0702 end
0703 FMT = pre2fmtcol(PRE,WID,SPC,Ncol);
0704
0705 function FMT = pre2fmtcol(PRE,WID,SPC,Ncol)
0706
0707
0708
0709
0710 [w,w,iw] = unique(WID);
0711 [p,p,ip] = unique(PRE);
0712 Nw = length(w);
0713 Np = length(p);
0714 Sw = cell(1,Nw);
0715 Sp = cell(1,Np);
0716 for k = 1:Nw
0717 Sw{k} = int2str(WID(w(k)));
0718 end
0719 for k = 1:Np
0720 Sp{k} = int2str(PRE(p(k)));
0721 end
0722
0723 if length(SPC)==2
0724 flag = SPC(1);
0725 SPC(1) = [];
0726 else
0727 flag = '';
0728 end
0729
0730 FMT = cell(1,1+(Ncol-1)*(Nw*Np~=1));
0731 FMT{1} = ['%' flag Sw{iw(1)} '.' Sp{ip(1)} SPC];
0732 if Nw*Np~=1
0733 for k = 2:Ncol
0734 FMT{k} = [ '%' flag Sw{iw(k)} '.' Sp{ip(k)} SPC];
0735 end
0736 end
0737
0738 function WID = get_wid(PRE,x)
0739
0740
0741 M = get_order(x);
0742 M(M<0) = 0;
0743 M = M+1;
0744 M = M+(x<0);
0745
0746 WID = max(M,[],1);
0747
0748 WID = WID + (PRE+1).*(PRE>0);
0749
0750 isbad = any(~isfinite(x),1);
0751 isbad(isbad) = (WID(isbad)<=3) | ~isfinite(WID(isbad));
0752 WID(isbad) = 3 + any(x(:,isbad)<0,1);
0753
0754 function [DLM,FMT,EOEL,full] = get_cell(DLM,FMT,EOEL,Ncol,cellopt)
0755
0756
0757
0758 nDLM = 0;
0759 nFMT = double(~isempty(FMT));
0760 full = false;
0761
0762 while ~isempty(cellopt)
0763 n = length(cellopt{1});
0764 ind = regexp([' ' cellopt{1}{1} ' '],'[^%]%[^%]');
0765 m = length(ind);
0766 if (n==1 ) && ((m~=0) && (((m==1) || (m==Ncol)) || (Ncol==0)))
0767
0768 FMT = cellopt{1}; nFMT = nFMT+1;
0769 full = (m==Ncol);
0770 elseif (m==1) && ((n~=0) && ((n==Ncol) || (Ncol==0)))
0771
0772 for k = 2:Ncol
0773
0774 ind = regexp([' ' cellopt{1}{k} ' '],'[^%]%[^%]');
0775 if length(ind)~=1
0776 error('CVARGAS:saveascii:incorrectFmtCellInput',...
0777 'Incorrect FMT cell of strings input.')
0778 end
0779 end
0780 FMT = cellopt{1}; nFMT = nFMT+1;
0781 elseif (n==1) && (m==0)
0782
0783 DLM = cellopt{1}; nDLM = nDLM+1;
0784 elseif (m==0) && ((n==(Ncol-1)) || (Ncol==0))
0785
0786 DLM = cellopt{1}; nDLM = nDLM+1;
0787 else
0788 if m==0
0789 error('CVARGAS:saveascii:incorrectCellLengthInput',...
0790 'DLM cell of string must be of length 1 or Ncol-1.')
0791 else
0792 error('CVARGAS:saveascii:incorrectFmtLengthInput',...
0793 'FMT cell of string must be of length 1 or Ncol.')
0794 end
0795 end
0796 cellopt(1) = [];
0797 end
0798
0799
0800 if nDLM>1
0801 error('CVARGAS:saveascii:tooManyDlmInput',...
0802 'More than one DLM given.')
0803 end
0804 if nFMT>1
0805 error('CVARGAS:saveascii:tooManyFmtInput',...
0806 'More than one FMT given.')
0807 end
0808
0809
0810 if full && (length(FMT{1})>1) && (strcmp(FMT{1}(end-1:end),'\n') || ...
0811 strcmp(FMT{1}(end-1:end),'\r'))
0812 EOEL = '';
0813 end
0814
0815 function [FILE,PER,TOB,WAR,DLM,FMT,EOEL,full] = ...
0816 get_char(FILE,PER,TOB,WAR,DLM,FMT,EOEL,Ncol,stropt,ichar)
0817
0818
0819
0820 nFILE = double(~isempty(FILE));
0821 nPER = 0;
0822 nDLM = ~isempty(DLM);
0823 nFMT = double(~isempty(FMT));
0824 full = false;
0825
0826
0827 while ~isempty(stropt)
0828
0829 ind = regexp([' ' stropt{1} ' '],'[^%]%[^%]');
0830 m = length(ind);
0831 if m~=0 && (((m==1) || (m==Ncol)) || (Ncol==0))
0832
0833 FMT = stropt(1); nFMT = nFMT+1;
0834 full = (m==Ncol);
0835 else
0836
0837 switch stropt{1}
0838 case {'w','a'}
0839 PER = stropt{1}; nPER = nPER+1;
0840 case {'wt','at','wb','ab'}
0841 PER = stropt{1}(1); nPER = nPER+1;
0842 TOB = stropt{1}(2);
0843 case {'w -i'}
0844 PER = stropt{1}(1); nPER = nPER+1;
0845 WAR = true;
0846 case {'wt -i','wb -i'}
0847 PER = stropt{1}(1); nPER = nPER+1;
0848 TOB = stropt{1}(2);
0849 WAR = true;
0850 otherwise
0851 if ichar(1)==1
0852 FILE = stropt{1}; nFILE = nFILE+1;
0853 else
0854 if nDLM
0855 error('CVARGAS:saveascii:incorrectCharInput', ...
0856 ['Incorrect char input. \n\n' ...
0857 'Must be a valid OPEN MODE (''a'',''w'') or a valid FILE NAME ' ...
0858 '(as second input). '])
0859 end
0860 DLM = {stropt{1}};
0861 end
0862 end
0863 end
0864 stropt(1) = [];
0865 ichar(1) = [];
0866 end
0867
0868
0869 if nFILE>1
0870 error('CVARGAS:saveascii:tooManyFileInput',...
0871 'More than one FILE given.')
0872 end
0873 if nPER>1
0874 error('CVARGAS:saveascii:tooManyPermissionsInput',...
0875 'More than one open file permission given.')
0876 end
0877 if nFMT>1
0878 error('CVARGAS:saveascii:tooManyFmtInput',...
0879 'More than one FMT given.')
0880 end
0881 if (nPER==1) && (nFILE==0)
0882 warning('CVARGAS:saveascii:ignoredPermissionInput',...
0883 'Ignored Permission input because no FILE given.')
0884 end
0885
0886
0887 if full && (length(FMT{1})>1) && (strcmp(FMT{1}(end-1:end),'\n') || ...
0888 strcmp(FMT{1}(end-1:end),'\r'))
0889 EOEL = '';
0890 end
0891
0892 function FULLFMT = get_strform(DLM,FMT,Ncol)
0893
0894
0895 FULLFMT = '';
0896 Nf = length(FMT);
0897
0898 if Nf==1
0899 Nf = numel(strfind(FMT{1},'%'));
0900 if Nf==Ncol
0901 FULLFMT = FMT{1};
0902 elseif Nf~=1
0903 error('CVARGAS:saveascii:invalidStrOptionsSize',...
0904 'Number of format strings must be 0, 1 or Ncol.')
0905 end
0906 end
0907
0908 if isempty(FULLFMT)
0909 FULLFMT = FMT{1};
0910 Nd = length(DLM);
0911 if Nd==1
0912 if Nf==1
0913 FULLFMT = [FULLFMT repmat([DLM{1} FMT{1}],1,Ncol-1)];
0914 else
0915 for k = 2:Ncol
0916 FULLFMT = [FULLFMT DLM{1} FMT{k}];
0917 end
0918 end
0919 elseif Nd==(Ncol-1)
0920 if Nf==1
0921 for k = 2:Ncol
0922 FULLFMT = [FULLFMT DLM{k-1} FMT{1}];
0923 end
0924 else
0925 for k = 2:Ncol
0926 FULLFMT = [FULLFMT DLM{k-1} FMT{k}];
0927 end
0928 end
0929 else
0930 if Nf==1
0931 FULLFMT = repmat(FULLFMT,1,Ncol);
0932 else
0933 for k = 2:Ncol
0934 FULLFMT = [FULLFMT FMT{k}];
0935 end
0936 end
0937 end
0938 end
0939
0940 function M = get_order(x)
0941
0942
0943
0944 if isinteger(x)
0945 x = double(x);
0946 end
0947 temp = warning('off','MATLAB:log:logOfZero');
0948 M = floor(log10(abs(x)));
0949 M(x==0) = 0;
0950 warning(temp.state,'MATLAB:log:logOfZero')
0951
0952 function y = maxinf(x,varargin)
0953
0954
0955
0956
0957
0958
0959 y = max(x,varargin{:});
0960 iinf = isinf(y);
0961 if any(iinf(:))
0962 xinf = y(iinf);
0963 x(~isfinite(x)) = NaN;
0964 y = max(x,varargin{:});
0965 inan = isnan(y(iinf));
0966 if any(inan(:))
0967 y(iinf(inan)) = xinf(inan);
0968 end
0969 end
0970
0971 function y = mininf(x,varargin)
0972
0973
0974
0975
0976
0977
0978 y = min(x,varargin{:});
0979 iinf = isinf(y);
0980 if any(iinf(:))
0981 xinf = y(iinf);
0982 x(~isfinite(x)) = NaN;
0983 y = min(x,varargin{:});
0984 inan = isnan(y(iinf));
0985 if any(inan(:))
0986 y(iinf(inan)) = xinf(inan);
0987 end
0988 end
0989
0990 function n = isnatural(n)
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004 n = (n==floor(n)) & isreal(n) & isnumeric(n) & isfinite(n);
1005
1006
1007