Diff of /functions/@mmo/permute.m [000000] .. [422372]

Switch to unified view

a b/functions/@mmo/permute.m
1
function res = permute(obj, dims);
2
3
if length(dims) > 3
4
    error('Max 3 dimensions for permutation');
5
elseif length(dims) == 2
6
    error('Permutation with 2 dimensions: use transpose instead');
7
end
8
9
newFileName = mmo.getnewfilename;
10
copyfile(obj.dataFile, newFileName);
11
12
res = obj;
13
res.dimensions = obj.dimensions(dims);
14
res.dataFile = newFileName;
15
tmpMMO1 = memmapfile(obj.dataFile, 'writable', obj.writable, 'format', { 'single' obj.dimensions 'x' });
16
tmpMMO2 = memmapfile(res.dataFile, 'writable', true        , 'format', { 'single' res.dimensions 'x' });
17
18
% copy the data
19
% -------------
20
d = res.dimensions;
21
for i1 = 1:obj.dimensions(1)
22
    s.type = '()';
23
    s.subs = { i1 ':' ':' };
24
    tmpdata = squeeze(subsref(tmpMMO1.Data.x,s));
25
26
    if all(dims == [2 1 3]), tmpMMO2.Data.x( :,i1, :) = reshape(tmpdata , d(1),    1, d(3)); end
27
    if all(dims == [3 1 2]), tmpMMO2.Data.x( :,i1, :) = reshape(tmpdata', d(1),    1, d(3)); end
28
29
    if all(dims == [2 3 1]), tmpMMO2.Data.x( :, :,i1) = reshape(tmpdata , d(1), d(2),    1); end
30
    if all(dims == [3 2 1]), tmpMMO2.Data.x( :, :,i1) = reshape(tmpdata', d(1), d(2),    1); end
31
32
    if all(dims == [1 2 3]), tmpMMO2.Data.x(i1, :, :) = reshape(tmpdata ,    1, d(2), d(3)); end
33
    if all(dims == [1 3 2]), tmpMMO2.Data.x(i1, :, :) = reshape(tmpdata',    1, d(2), d(3)); end
34
end
35
36
% slower versions below
37
% for i1 = 1:obj.dimensions(1)
38
%     for i2 = 1:obj.dimensions(3)
39
%         s.type = '()';
40
%         s.subs = { i1 ':' i2 };
41
%         tmpdata = subsref(tmpMMO1.Data.x,s);
42
%         if all(dims == [2 1 3]), tmpMMO2.Data.x( :,i1,i2) = tmpdata; end
43
%         if all(dims == [2 3 1]), tmpMMO2.Data.x( :,i2,i1) = tmpdata; end
44
%         
45
%         if all(dims == [1 2 3]), tmpMMO2.Data.x(i1, :,i2) = tmpdata; end
46
%         if all(dims == [3 2 1]), tmpMMO2.Data.x(i2, :,i1) = tmpdata; end
47
%         
48
%         if all(dims == [1 3 2]), tmpMMO2.Data.x(i1,i2, :) = tmpdata; end
49
%         if all(dims == [3 1 2]), tmpMMO2.Data.x(i2,i1, :) = tmpdata; end
50
%     end
51
% end
52
% 
53
% for i1 = 1:obj.dimensions(2)
54
%     for i2 = 1:obj.dimensions(3)
55
%         s.type = '()';
56
%         s.subs = { ':' i1 i2 };
57
%         tmpdata = subsref(tmpMMO1.Data.x,s);
58
%         if all(dims == [1 2 3]), tmpMMO2.Data.x( :,i1,i2) = tmpdata; end
59
%         if all(dims == [1 3 2]), tmpMMO2.Data.x( :,i2,i1) = tmpdata; end
60
%         if all(dims == [2 1 3]), tmpMMO2.Data.x(i1, :,i2) = tmpdata; end
61
%         if all(dims == [2 3 1]), tmpMMO2.Data.x(i1,i2, :) = tmpdata; end
62
%         if all(dims == [3 2 1]), tmpMMO2.Data.x(i2,i1, :) = tmpdata; end
63
%         if all(dims == [3 1 2]), tmpMMO2.Data.x(i2, :,i1) = tmpdata; end
64
%     end
65
% end