0001 function [resels, reselspvert, edg] = SurfStatResels( slm, mask );
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 if isfield(slm,'tri')
0153 tri=sort(slm.tri,2);
0154 edg=unique([tri(:,[1 2]); tri(:,[1 3]); tri(:,[2 3])],'rows');
0155
0156 if nargin<2
0157 v=max(edg(:));
0158 mask=logical(zeros(1,v));
0159 mask(edg)=1;
0160 else
0161 if size(mask,1)>1
0162 mask=mask';
0163 end
0164 v=size(mask,2);
0165 end
0166
0167 m=sum(mask(:));
0168 lkc(1,1)=m;
0169
0170 maskedg=all(mask(edg),2);
0171 lkc(1,2)=sum(maskedg);
0172 if isfield(slm,'resl')
0173 r1=mean(sqrt(slm.resl(maskedg,:)),2);
0174 lkc(2,2)=sum(r1);
0175 end
0176
0177
0178 masktri=all(mask(tri),2);
0179 lkc(1,3)=sum(masktri);
0180 if isfield(slm,'resl')
0181 [tf,loc]=ismember(tri(masktri,[1 2]),edg,'rows'); l12=slm.resl(loc,:);
0182 [tf,loc]=ismember(tri(masktri,[1 3]),edg,'rows'); l13=slm.resl(loc,:);
0183 [tf,loc]=ismember(tri(masktri,[2 3]),edg,'rows'); l23=slm.resl(loc,:);
0184 a=max(4*l12.*l13-(l12+l13-l23).^2,0);
0185 r2=mean(sqrt(a),2)/4;
0186 lkc(2,3)=sum(mean(sqrt(l12)+sqrt(l13)+sqrt(l23),2))/2;
0187 lkc(3,3)=sum(r2);
0188 end
0189 if nargout>=2
0190 reselspvert=zeros(v,1);
0191 for j=1:3
0192 reselspvert=reselspvert+accumarray(tri(masktri,j),r2,[v 1]);
0193 end
0194 D=2;
0195 reselspvert=reselspvert'/(D+1)/sqrt(4*log(2))^D;
0196 end
0197 end
0198
0199 if isfield(slm,'lat')
0200 edg=SurfStatEdg(slm);
0201
0202 [I,J,K]=size(slm.lat);
0203 IJ=I*J;
0204 [i,j]=ndgrid(1:int32(I),1:int32(J));
0205 i=i(:);
0206 j=j(:);
0207
0208 c1=int32(find(rem(i+j,2)==0 & i<I & j<J));
0209 c2=int32(find(rem(i+j,2)==0 & i>1 & j<J));
0210 c11=int32(find(rem(i+j,2)==0 & i==I & j<J));
0211 c21=int32(find(rem(i+j,2)==0 & i==I & j>1));
0212 c12=int32(find(rem(i+j,2)==0 & i<I & j==J));
0213 c22=int32(find(rem(i+j,2)==0 & i>1 & j==J));
0214
0215 d1=find(rem(i+j,2)==1 & i<I & j<J)+IJ;
0216 d2=find(rem(i+j,2)==1 & i>1 & j<J)+IJ;
0217
0218 tri1=[c1 c1+1 c1+1+I;
0219 c1 c1+I c1+1+I;
0220 c2-1 c2 c2-1+I;
0221 c2 c2-1+I c2+I];
0222 tri2=[c1 c1+1 c1+1+IJ;
0223 c1 c1+IJ c1+1+IJ;
0224 c1 c1+I c1+I+IJ;
0225 c1 c1+IJ c1+I+IJ;
0226 c1 c1+1+I c1+1+IJ;
0227 c1 c1+1+I c1+I+IJ;
0228 c1 c1+1+IJ c1+I+IJ;
0229 c1+1+I c1+1+IJ c1+I+IJ;
0230 c2-1 c2 c2-1+IJ;
0231 c2 c2-1+IJ c2+IJ;
0232 c2-1 c2-1+I c2-1+IJ;
0233 c2-1+I c2-1+IJ c2-1+I+IJ;
0234 c2 c2-1+I c2+I+IJ;
0235 c2 c2-1+IJ c2+I+IJ;
0236 c2 c2-1+I c2-1+IJ;
0237 c2-1+I c2-1+IJ c2+I+IJ;
0238 c11 c11+I c11+I+IJ;
0239 c11 c11+IJ c11+I+IJ;
0240 c21-I c21 c21-I+IJ;
0241 c21 c21-I+IJ c21+IJ;
0242 c12 c12+1 c12+1+IJ;
0243 c12 c12+IJ c12+1+IJ;
0244 c22-1 c22 c22-1+IJ;
0245 c22 c22-1+IJ c22+IJ];
0246 tri3=[d1 d1+1 d1+1+I;
0247 d1 d1+I d1+1+I;
0248 d2-1 d2 d2-1+I;
0249 d2 d2-1+I d2+I];
0250 tet1=[c1 c1+1 c1+1+I c1+1+IJ;
0251 c1 c1+I c1+1+I c1+I+IJ;
0252 c1 c1+1+I c1+1+IJ c1+I+IJ;
0253 c1 c1+IJ c1+1+IJ c1+I+IJ;
0254 c1+1+I c1+1+IJ c1+I+IJ c1+1+I+IJ;
0255 c2-1 c2 c2-1+I c2-1+IJ;
0256 c2 c2-1+I c2+I c2+I+IJ;
0257 c2 c2-1+I c2-1+IJ c2+I+IJ;
0258 c2 c2-1+IJ c2+IJ c2+I+IJ;
0259 c2-1+I c2-1+IJ c2-1+I+IJ c2+I+IJ];
0260
0261 v=sum(slm.lat(:));
0262 if nargin<2
0263 mask=logical(ones(1,v));
0264 else
0265 if size(mask,1)>1
0266 mask=mask';
0267 end
0268 end
0269 if nargout>=2
0270 reselspvert=zeros(v,1);
0271 end
0272
0273 vs=cumsum(squeeze(sum(sum(slm.lat))));
0274 vs=int32([0; vs; vs(K)]);
0275 es=0;
0276 lat=logical(zeros(I,J,2));
0277 lat(:,:,1)=slm.lat(:,:,1);
0278 lkc=zeros(4);
0279 fprintf(1,'%s',[num2str(K) ' slices to resel, % remaining: 100 ']);
0280 n10=floor(K/10);
0281 for k=1:K
0282 if rem(k,n10)==0
0283 fprintf(1,'%s',[num2str(round(100*(1-k/K))) ' ']);
0284 end
0285 f=rem(k,2);
0286 if k<K
0287 lat(:,:,f+1)=slm.lat(:,:,k+1);
0288 else
0289 lat(:,:,f+1)=zeros(I,J);
0290 end
0291 vid=int32(cumsum(lat(:)).*lat(:))';
0292 if f
0293 edg1=edg(edg(:,1)>vs(k) & edg(:,1)<=vs(k+1),:)-vs(k);
0294 edg2=edg(edg(:,1)>vs(k) & edg(:,2)<=vs(k+2),:)-vs(k);
0295 tri=[vid(tri1(all(lat(tri1),2),:)); vid(tri2(all(lat(tri2),2),:))];
0296 mask1=mask((vs(k)+1):vs(k+2));
0297 else
0298 edg1=[edg(edg(:,1)>vs(k) & edg(:,2)<=vs(k+1),:)-vs(k)+vs(k+2)-vs(k+1);
0299 edg(edg(:,1)<=vs(k+1) & edg(:,2)>vs(k+1),2)-vs(k+1) ...
0300 edg(edg(:,1)<=vs(k+1) & edg(:,2)>vs(k+1),1)-vs(k)+vs(k+2)-vs(k+1)];
0301 edg2=[edg1; edg(edg(:,1)>vs(k+1) & edg(:,2)<=vs(k+2),:)-vs(k+1)];
0302 tri=[vid(tri3(all(lat(tri3),2),:)); vid(tri2(all(lat(tri2),2),:))];
0303 mask1=[mask((vs(k+1)+1):vs(k+2)) mask((vs(k)+1):vs(k+1))];
0304 end
0305 tet=vid(tet1(all(lat(tet1),2),:));
0306
0307 m1=max(double(edg2(:,1)));
0308 ue=double(edg2(:,1))+m1*(double(edg2(:,2))-1);
0309 e=size(edg2,1);
0310 ae=1:e;
0311 if e<2^31
0312 sparsedg=sparse(ue,1,ae);
0313 end
0314
0315 lkc1=zeros(4);
0316 lkc1(1,1)=sum(mask((vs(k)+1):vs(k+1)));
0317
0318
0319 maskedg=all(mask1(edg1),2);
0320 lkc1(1,2)=sum(maskedg);
0321 if isfield(slm,'resl')
0322 r1=mean(sqrt(slm.resl(find(maskedg)+es,:)),2);
0323 lkc1(2,2)=sum(r1);
0324 end
0325
0326
0327 masktri=all(mask1(tri),2);
0328 lkc1(1,3)=sum(masktri);
0329 if isfield(slm,'resl')
0330 if e<2^31
0331 l12=slm.resl(sparsedg(tri(masktri,1)+m1*(tri(masktri,2)-1),1)+es,:);
0332 l13=slm.resl(sparsedg(tri(masktri,1)+m1*(tri(masktri,3)-1),1)+es,:);
0333 l23=slm.resl(sparsedg(tri(masktri,2)+m1*(tri(masktri,3)-1),1)+es,:);
0334 else
0335 l12=slm.resl(interp1(ue,ae,tri(masktri,1)+m1*(tri(masktri,2)-1),'nearest')+es,:);
0336 l13=slm.resl(interp1(ue,ae,tri(masktri,1)+m1*(tri(masktri,3)-1),'nearest')+es,:);
0337 l23=slm.resl(interp1(ue,ae,tri(masktri,2)+m1*(tri(masktri,3)-1),'nearest')+es,:);
0338 end
0339 a=max(4*l12.*l13-(l12+l13-l23).^2,0);
0340 r2=mean(sqrt(a),2)/4;
0341 lkc1(2,3)=sum(mean(sqrt(l12)+sqrt(l13)+sqrt(l23),2))/2;
0342 lkc1(3,3)=sum(r2);
0343
0344 if nargout>=2 & K==1
0345 for j=1:3
0346 if f
0347 v1=tri(masktri,j)+vs(k);
0348 else
0349 v1=tri(masktri,j)+vs(k+1);
0350 v1=v1-int32(v1>vs(k+2))*(vs(k+2)-vs(k));
0351 end
0352 reselspvert=reselspvert+accumarray(v1,r2,[v 1]);
0353 end
0354 end
0355 end
0356
0357
0358 masktet=all(mask1(tet),2);
0359 lkc1(1,4)=sum(masktet);
0360 if isfield(slm,'resl') & k<K
0361 if e<2^31
0362 l12=slm.resl(sparsedg(tet(masktet,1)+m1*(tet(masktet,2)-1),1)+es,:);
0363 l13=slm.resl(sparsedg(tet(masktet,1)+m1*(tet(masktet,3)-1),1)+es,:);
0364 l23=slm.resl(sparsedg(tet(masktet,2)+m1*(tet(masktet,3)-1),1)+es,:);
0365 l14=slm.resl(sparsedg(tet(masktet,1)+m1*(tet(masktet,4)-1),1)+es,:);
0366 l24=slm.resl(sparsedg(tet(masktet,2)+m1*(tet(masktet,4)-1),1)+es,:);
0367 l34=slm.resl(sparsedg(tet(masktet,3)+m1*(tet(masktet,4)-1),1)+es,:);
0368 else
0369 l12=slm.resl(interp1(ue,ae,tet(masktet,1)+m1*(tet(masktet,2)-1),'nearest')+es,:);
0370 l13=slm.resl(interp1(ue,ae,tet(masktet,1)+m1*(tet(masktet,3)-1),'nearest')+es,:);
0371 l23=slm.resl(interp1(ue,ae,tet(masktet,2)+m1*(tet(masktet,3)-1),'nearest')+es,:);
0372 l14=slm.resl(interp1(ue,ae,tet(masktet,1)+m1*(tet(masktet,4)-1),'nearest')+es,:);
0373 l24=slm.resl(interp1(ue,ae,tet(masktet,2)+m1*(tet(masktet,4)-1),'nearest')+es,:);
0374 l34=slm.resl(interp1(ue,ae,tet(masktet,3)+m1*(tet(masktet,4)-1),'nearest')+es,:);
0375 end
0376 a4=max(4*l12.*l13-(l12+l13-l23).^2,0);
0377 a3=max(4*l12.*l14-(l12+l14-l24).^2,0);
0378 a2=max(4*l13.*l14-(l13+l14-l34).^2,0);
0379 a1=max(4*l23.*l24-(l23+l24-l34).^2,0);
0380
0381 d12=4*l12.*l34-(l13+l24-l23-l14).^2;
0382 d13=4*l13.*l24-(l12+l34-l23-l14).^2;
0383 d14=4*l14.*l23-(l12+l34-l24-l13).^2;
0384
0385 h=(a1<=0)|(a2<=0);
0386 delta12=sum(mean(sqrt(l34).*pacos((d12-a1-a2)./sqrt(a1.*a2+h)/2.*(1-h)+h),2));
0387 h=(a1<=0)|(a3<=0);
0388 delta13=sum(mean(sqrt(l24).*pacos((d13-a1-a3)./sqrt(a1.*a3+h)/2.*(1-h)+h),2));
0389 h=(a1<=0)|(a4<=0);
0390 delta14=sum(mean(sqrt(l23).*pacos((d14-a1-a4)./sqrt(a1.*a4+h)/2.*(1-h)+h),2));
0391 h=(a2<=0)|(a3<=0);
0392 delta23=sum(mean(sqrt(l14).*pacos((d14-a2-a3)./sqrt(a2.*a3+h)/2.*(1-h)+h),2));
0393 h=(a2<=0)|(a4<=0);
0394 delta24=sum(mean(sqrt(l13).*pacos((d13-a2-a4)./sqrt(a2.*a4+h)/2.*(1-h)+h),2));
0395 h=(a3<=0)|(a4<=0);
0396 delta34=sum(mean(sqrt(l12).*pacos((d12-a3-a4)./sqrt(a3.*a4+h)/2.*(1-h)+h),2));
0397
0398 r3=mean(sqrt(max((4*a1.*a2-(a1+a2-d12).^2)./(l34+(l34<=0)).*(l34>0),0)),2)/48;
0399
0400 lkc1(2,4)=(delta12+delta13+delta14+delta23+delta24+delta34)/(2*pi);
0401 lkc1(3,4)=sum(mean(sqrt(a1)+sqrt(a2)+sqrt(a3)+sqrt(a4),2))/8;
0402 lkc1(4,4)=sum(r3);
0403
0404 if nargout>=2
0405 for j=1:4
0406 if f
0407 v1=tet(masktet,j)+vs(k);
0408 else
0409 v1=tet(masktet,j)+vs(k+1);
0410 v1=v1-int32(v1>vs(k+2))*(vs(k+2)-vs(k));
0411 end
0412 reselspvert=reselspvert+accumarray(v1,r3,[v 1]);
0413 end
0414 end
0415 end
0416 lkc=lkc+lkc1;
0417 es=es+size(edg1,1);
0418 end
0419 if nargout>=2
0420 D=2+(K>1);
0421 reselspvert=reselspvert'/(D+1)/sqrt(4*log(2))^D;
0422 end
0423 fprintf(1,'%s\n','Done');
0424 end
0425
0426 D=size(lkc,1)-1;
0427 D2=size(lkc,2)-1;
0428 tpltz=toeplitz((-1).^(0:D),(-1).^(0:D2));
0429 lkcs=sum(tpltz.*lkc,2)';
0430 lkcs=lkcs(1:max(find(abs(lkcs))));
0431 resels=lkcs./sqrt(4*log(2)).^(0:D);
0432
0433 return
0434 end
0435
0436
0437 function y=pacos(x)
0438 y=acos(min(abs(x),1).*sign(x));
0439 return
0440 end