* Bug 8297 fixed: cat() slowness was crippling. Rewritten
[scilab.git] / scilab / modules / elementary_functions / tests / nonreg_tests / bug_8297_cat_old.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA - Farid BELAHCENE
3 // Copyright (C) DIGITEO - 2011 - Allan CORNET
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 function  y = cat_old(dims, varargin)
15     //
16     // CAT function concatenates the inputs arguments (included in varargin) according to dims
17     // if dims=1 then concatenation is done according to the rows of the input arguments, if dims=2 then concatenation is done according to the columns of the input arguments,...
18     // Output
19     // -y : a (multi) array, the result of the concatenation
20     // Input
21     // -dims : a scalar, the dimension chosen for the concatenation
22     // -varargin : scalars, matrices, hypermatrices to concatenate
23     // F.B
24
25     rhs = argn(2);
26     if rhs < 1 then
27         error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),"cat", 1));
28     end
29
30     // dims must be a positive real
31     if type(dims)==1 & dims>=0 & size(dims,"*")==1
32         dims = max(1,round(dims));
33     else
34         error(msprintf(gettext("%s: Wrong type for input argument #%d: A positive real expected.\n"),"cat",1));
35     end
36
37     // verify if dims value is superior to the dimension of the input arguments
38     dimssupvar = %t;
39     for i = 1:size(varargin)
40         if ndims(varargin(i))>=dims then
41             dimssupvar = %f;
42         end
43     end
44
45     // delete all empty input arguments
46     for i = size(varargin):-1:2
47         if isempty(varargin(i)) then
48             varargin(i) = null();
49         end
50     end
51
52     // if just one input argument to concatenate then return this argument
53     if size(varargin) == 1 then
54         y = varargin(1);
55         return
56     elseif isempty(varargin(1)) then
57         varargin(1) = null();
58     end
59
60     // create 2 lists sizevar and sizevarless which contains (respectively) the size of all input arguments (sizevar(i) = size(varargin(i))), and the size of all input arguments excluding the size of the dimension number dims
61     onedims = ones(1,dims);
62     sizevarless = list();
63     sizevar = list();
64
65     for i=1:size(varargin)
66         var = onedims;
67         var(1:ndims(varargin(i))) = size(varargin(i));
68         sizevar(i) = var;
69         var(dims) = [];
70         sizevarless(i) = var;
71     end
72
73     for i=2:size(varargin)
74         if or(sizevarless(i-1)<> sizevarless(i))
75             error(msprintf(gettext("%s: Wrong size for input arguments: Same size expected.\n"),"cat"));
76         end
77     end
78
79     // case : input arguments are cells arrrays
80     if typeof(varargin(1))=="ce"
81         ytemp = cell();
82     else   // case : input arguments are arrays of doubles, strings, characters,...
83         ytemp = [];
84     end
85
86     vartype = typeof(varargin(1));
87
88     for j=2:size(varargin)
89         if  typeof(varargin(j)) ==vartype
90             vartype = typeof(varargin(j));
91         else
92             error(msprintf(gettext("%s: Wrong type for input arguments: Same types expected.\n"),"cat"));
93         end
94     end
95
96     // permorder is the order of the permutation
97     permuteorder = 1:size(sizevarless(1),"*")+1;
98     if ~dimssupvar then
99         permuteorder(dims) = [];
100         permuteorder = [dims permuteorder];
101     end
102
103     // permutevar is a list which contains the permuted input arguments arrays
104     permutevar = list();
105     for j=1:size(varargin)
106         permutevar(j) = permute(varargin(j),permuteorder);
107     end
108
109     for i=1:prod(sizevarless(1))
110         for j=1:size(varargin)
111             permutevarj = permutevar(j);
112             lj = size(varargin(j),"*")/prod(sizevarless(j));
113             if typeof(permutevarj)=="ce" then
114                 for k=1+lj*(i-1):lj*i
115                     ytemp{size(ytemp,"*")+1} = permutevarj{k};
116                 end
117             else
118                 ytemp= [ytemp (permutevarj(1+lj*(i-1):lj*i)).'];
119             end
120         end
121     end
122     ytemp = matrix(ytemp,1,-1);
123
124     sizevar = sizevar(1);
125     prodxdims = prod(sizevar(1:dims));
126     ny = prod(sizevar)/prodxdims;
127     ydimsize = size(ytemp,2)/(prod(sizevarless(1)));
128     prodxdimless = prod(sizevar(1:dims-1));
129     ind = 1;
130     for j=1:ydimsize-1
131         ind = [ind 1+prodxdimless*j];
132     end
133     for i=0:ny-1
134         index = [];
135         for j=0:prodxdimless-1
136             index = [index ind+j+i*(prodxdimless)*ydimsize];
137         end
138         if typeof(ytemp)=="ce"
139             ceindex = (1:ydimsize*prodxdimless)+ydimsize*prodxdimless*(i);
140             for k=1:size(index,"*")
141                 y{index(k)} = ytemp{ceindex(k)};
142             end
143         else
144             y(index) = ytemp((1:ydimsize*prodxdimless)+ydimsize*prodxdimless*(i));
145         end
146     end
147
148     // redimension of y
149     ysize = sizevarless(1);
150     if dimssupvar then
151         ysize($+1) = size(varargin);
152     else
153         if dims == size(sizevarless(1))+1
154             ysize(dims) = size(ytemp,2)/prod(sizevarless(1));
155         else
156             ysize = [ysize(1:dims-1) size(ytemp,2)/prod(sizevarless(1)) ysize(dims:$)];
157         end
158     end
159     y = matrix(y,ysize);
160
161 endfunction