0001 function z = hadamard( x, y, idx )
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 rx = x.rank;
0018 n = x.size;
0019 d = x.order;
0020
0021
0022 if ~exist( 'idx', 'var' )
0023 ry = y.rank;
0024
0025 C = cell(1,d);
0026 for i = 1:d
0027
0028 xx1 = permute( x.U{i}, [2 1 3]);
0029 p = size( y.U{i}, 4 );
0030 C{i} = zeros( [rx(i)*ry(i), n(i), rx(i+1)*ry(i+1), p] );
0031 for j = 1:p
0032 yy = permute( y.U{i}(:,:,:,j), [2 1 3]);
0033
0034
0035 xx = repmat( xx1(:), [1, ry(i)*ry(i+1)]);
0036 yy = repmat( yy(:), [1, rx(i)*rx(i+1)]);
0037
0038
0039 xx = reshape( xx, [n(i), rx(i), rx(i+1), ry(i), ry(i+1)]);
0040 yy = reshape( yy, [n(i), ry(i), ry(i+1), rx(i), rx(i+1)]);
0041
0042 xx = permute( xx, [1 2 4 3 5]);
0043 yy = permute( yy, [1 4 2 5 3]);
0044
0045 xx = reshape( xx, [n(i), rx(i)*ry(i), rx(i+1)*ry(i+1)]);
0046 yy = reshape( yy, [n(i), rx(i)*ry(i), rx(i+1)*ry(i+1)]);
0047
0048
0049 zz = xx.*yy;
0050 C{i}(:,:,:,j) = permute( zz, [2 1 3] );
0051 end
0052 end
0053 z = TTeMPS( C );
0054 else
0055 i = idx;
0056 ry = [size(y,1), size(y,3)];
0057
0058
0059 xx1 = permute( x.U{i}, [2 1 3]);
0060 p = size( y, 4 );
0061 z = zeros( [rx(i)*ry(1), n(i), rx(i+1)*ry(2), p] );
0062 for j = 1:p
0063 yy = permute( y(:,:,:,j), [2 1 3]);
0064
0065
0066 xx = repmat( xx1(:), [1, ry(1)*ry(2)]);
0067 yy = repmat( yy(:), [1, rx(i)*rx(i+1)]);
0068
0069
0070 xx = reshape( xx, [n(i), rx(i), rx(i+1), ry(1), ry(2)]);
0071 yy = reshape( yy, [n(i), ry(1), ry(2), rx(i), rx(i+1)]);
0072
0073 xx = permute( xx, [1 2 4 3 5]);
0074 yy = permute( yy, [1 4 2 5 3]);
0075
0076 xx = reshape( xx, [n(i), rx(i)*ry(1), rx(i+1)*ry(2)]);
0077 yy = reshape( yy, [n(i), rx(i)*ry(1), rx(i+1)*ry(2)]);
0078
0079
0080 zz = xx.*yy;
0081 z(:,:,:,j) = permute( zz, [2 1 3] );
0082 end
0083 end
0084
0085 end