[37] | 1 | function Y=repmat(varargin) |
---|
| 2 | %REPMAT (overloaded) |
---|
| 3 | |
---|
| 4 | % Author Johan Löfberg |
---|
| 5 | % $Id: repmat.m,v 1.7 2006/07/26 20:17:58 joloef Exp $ |
---|
| 6 | |
---|
| 7 | try |
---|
| 8 | X = varargin{1}; |
---|
| 9 | Y = X; |
---|
| 10 | Y.basis = []; |
---|
| 11 | n = Y.dim(1); |
---|
| 12 | m = Y.dim(2); |
---|
| 13 | for i = 1:length(Y.lmi_variables)+1 |
---|
| 14 | temp = repmatfixed(reshape(X.basis(:,i),n,m),varargin{2:end}); |
---|
| 15 | Y.basis(:,i) = temp(:); |
---|
| 16 | end |
---|
| 17 | Y.dim(1) = size(temp,1); |
---|
| 18 | Y.dim(2) = size(temp,2); |
---|
| 19 | % Reset info about conic terms |
---|
| 20 | Y.conicinfo = [0 0]; |
---|
| 21 | catch |
---|
| 22 | error(lasterr) |
---|
| 23 | end |
---|
| 24 | |
---|
| 25 | |
---|
| 26 | |
---|
| 27 | function B = repmatfixed(A,M,N) |
---|
| 28 | |
---|
| 29 | if nargin < 2 |
---|
| 30 | error('MATLAB:repmat:NotEnoughInputs', 'Requires at least 2 inputs.') |
---|
| 31 | end |
---|
| 32 | |
---|
| 33 | if nargin == 2 |
---|
| 34 | if isscalar(M) |
---|
| 35 | siz = [M M]; |
---|
| 36 | else |
---|
| 37 | siz = M; |
---|
| 38 | end |
---|
| 39 | else |
---|
| 40 | siz = [M N]; |
---|
| 41 | end |
---|
| 42 | |
---|
| 43 | if isscalar(A) |
---|
| 44 | nelems = prod(siz); |
---|
| 45 | if nelems>0 |
---|
| 46 | % Since B doesn't exist, the first statement creates a B with |
---|
| 47 | % the right size and type. Then use scalar expansion to |
---|
| 48 | % fill the array. Finally reshape to the specified size. |
---|
| 49 | B = spalloc(nelems,1,nnz(A)); |
---|
| 50 | B(nelems) = A; |
---|
| 51 | if ~isequal(B(1), B(nelems)) | ~(isnumeric(A) | islogical(A)) |
---|
| 52 | % if B(1) is the same as B(nelems), then the default value filled in for |
---|
| 53 | % B(1:end-1) is already A, so we don't need to waste time redoing |
---|
| 54 | % this operation. (This optimizes the case that A is a scalar zero of |
---|
| 55 | % some class.) |
---|
| 56 | B(:) = A; |
---|
| 57 | end |
---|
| 58 | B = reshape(B,siz); |
---|
| 59 | else |
---|
| 60 | B = A(ones(siz)); |
---|
| 61 | end |
---|
| 62 | elseif ndims(A) == 2 & numel(siz) == 2 |
---|
| 63 | [m,n] = size(A); |
---|
| 64 | |
---|
| 65 | if (m == 1 & siz(2) == 1) |
---|
| 66 | B = A(ones(siz(1), 1), :); |
---|
| 67 | elseif (n == 1 & siz(1) == 1) |
---|
| 68 | B = A(:, ones(siz(2), 1)); |
---|
| 69 | else |
---|
| 70 | mind = (1:m)'; |
---|
| 71 | nind = (1:n)'; |
---|
| 72 | mind = mind(:,ones(1,siz(1))); |
---|
| 73 | nind = nind(:,ones(1,siz(2))); |
---|
| 74 | B = A(mind,nind); |
---|
| 75 | end |
---|
| 76 | else |
---|
| 77 | Asiz = size(A); |
---|
| 78 | Asiz = [Asiz ones(1,length(siz)-length(Asiz))]; |
---|
| 79 | siz = [siz ones(1,length(Asiz)-length(siz))]; |
---|
| 80 | for i=length(Asiz):-1:1 |
---|
| 81 | ind = (1:Asiz(i))'; |
---|
| 82 | subs{i} = ind(:,ones(1,siz(i))); |
---|
| 83 | end |
---|
| 84 | B = A(subs{:}); |
---|
| 85 | end |
---|
| 86 | |
---|
| 87 | function a = isscalar(b) |
---|
| 88 | [n,m] = size(b); |
---|
| 89 | a = (n*m == 1); |
---|