0001 function [tracedtensor] = diagsum(tensor1, d1, d2)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 dim1=size(tensor1);
0016 numdims=length(dim1);
0017
0018
0019
0020 if d1==d2
0021 tracedtensor=squeeze(sum(tensor1,d1));
0022 elseif numdims==2
0023 tracedtensor=trace(tensor1);
0024 elseif dim1(d1)==1 && dim1(d2)==1
0025 tracedtensor=squeeze(tensor1);
0026 else
0027
0028
0029
0030 swapd1=d1;swapd2=d2;
0031
0032 if d1~=numdims-1 && d1~=numdims && d2~=numdims-1
0033 swapd1=numdims-1;
0034 elseif d1~=numdims-1 && d1~=numdims && d2~=numdims
0035 swapd1=numdims;
0036 end
0037 if d2~=numdims-1 && d2~=numdims && swapd1~=numdims-1
0038 swapd2=numdims-1;
0039 elseif d2~=numdims-1 && d2~=numdims && swapd1~=numdims
0040 swapd2=numdims;
0041 end
0042
0043
0044
0045 temp1=eye(numdims);
0046 permmatrix=temp1;
0047 permmatrix(:,d1)=temp1(:,swapd1);
0048 permmatrix(:,swapd1)=temp1(:,d1);
0049 permmatrix(:,d2)=temp1(:,swapd2);
0050 permmatrix(:,swapd2)=temp1(:,d2);
0051
0052 selectordim=dim1*permmatrix;
0053 permvector=(1:numdims)*permmatrix;
0054
0055
0056
0057 if numdims>3
0058 selector = ipermute(outer(ones(selectordim(1:numdims-2)), ...
0059 eye(selectordim(numdims-1), ...
0060 selectordim(numdims)), ...
0061 0), ...
0062 permvector);
0063 else
0064
0065
0066
0067 selector2=eye(selectordim(numdims-1), selectordim(numdims));
0068 selector=zeros(selectordim);
0069 for j=1:selectordim(1)
0070 selector(j, :, :)=selector2;
0071 end
0072 selector=ipermute(selector, permvector);
0073 end
0074
0075
0076
0077 tracedtensor=sum(sum(tensor1.*selector, d1), d2);
0078 tracedtensor=squeeze(tracedtensor);
0079
0080
0081 end
0082
0083
0084
0085
0086 nontracedimensions=dim1;
0087 nontracedimensions(d1)=[];
0088 if d2>d1
0089 nontracedimensions(d2-1)=[];
0090 else
0091 nontracedimensions(d2)=[];
0092 end
0093 tracedsize=size(tracedtensor);
0094
0095
0096 if length(tracedsize)==2 && tracedsize(2)==1 && ...
0097 (isempty(nontracedimensions) || tracedsize(1)~=nontracedimensions(1))
0098
0099 tracedtensor=tracedtensor.';
0100
0101 end