help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Help with matrix replication


From: Laurent Hoeltgen
Subject: Re: Help with matrix replication
Date: Thu, 20 Dec 2012 17:58:45 +0100
User-agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0

On 20/12/12 17:50, Richardson, Anthony wrote:
I want to duplicate the rows in a matrix n times and then duplicate the columns 
n times.

For example, if

a =

      1.0000e+00     2.0000e+00     3.0000e+00
      4.0000e+00     5.0000e+00     6.0000e+00

for n= 2, I want

b =

      1.0000e+00     1.0000e+00     2.0000e+00     2.0000e+00     3.0000e+00    
 3.0000e+00
      1.0000e+00     1.0000e+00     2.0000e+00     2.0000e+00     3.0000e+00    
 3.0000e+00
      4.0000e+00     4.0000e+00     5.0000e+00     5.0000e+00     6.0000e+00    
 6.0000e+00
      4.0000e+00     4.0000e+00     5.0000e+00     5.0000e+00     6.0000e+00    
 6.0000e+00

Note that this is not matrix replication(it is equivalent to using simple pixel 
replication to zoom in on an image matrix).  I thought I would be able to avoid 
loops by using some combination or repmat/repelems/reshape, but the best I 
could come up with was:

b = reshape(repmat(reshape(repelems(a, [1:numel(a); 
n(ones(1,numel(a)))])',n*rows(a),columns(a)),n,1),n*rows(a),n*columns(a));

After studying the "advanced indexing" section of the manual I came up with a 
more syntactically elegant (it does not appear to be any more time-efficient) solution:

b = a((1:rows(a))(ones(1,n),:), (1:columns(a))(ones(1,n),:));

I still feel as if I'm overlooking some simple method for doing what I want to 
do.  Does anyone have a better method?

By the way, imresize(a, 2, 'nearest') will do what I want, but this is a 
function from the image package and I'm trying to write some routines that 
duplicate the functionality of the image package without using any of those 
functions.
Thanks
Tony Richardson








I want to duplicate the rows in a matrix n times and then duplicate the
columns n times.

For example, if

a =

      1.0000e+00     2.0000e+00     3.0000e+00

      4.0000e+00     5.0000e+00     6.0000e+00

for n= 2, I want

b =

      1.0000e+00     1.0000e+00     2.0000e+00     2.0000e+00
3.0000e+00     3.0000e+00

      1.0000e+00     1.0000e+00     2.0000e+00     2.0000e+00
3.0000e+00     3.0000e+00

      4.0000e+00     4.0000e+00     5.0000e+00     5.0000e+00
6.0000e+00     6.0000e+00

      4.0000e+00     4.0000e+00     5.0000e+00     5.0000e+00
6.0000e+00     6.0000e+00

Note that this is not matrix replication(it is equivalent to using
simple pixel replication to zoom in on an image matrix).  I thought I
would be able to avoid loops by using some combination or
repmat/repelems/reshape, but the best I could come up with was:

b = reshape(repmat(reshape(repelems(a, [1:numel(a);
n(ones(1,numel(a)))])',n*rows(a),columns(a)),n,1),n*rows(a),n*columns(a));

After studying the “advanced indexing” section of the manual I came up
with a more syntactically elegant (it does not appear to be any more
time-efficient) solution:

b = a((1:rows(a))(ones(1,n),:), (1:columns(a))(ones(1,n),:));

I still feel as if I’m overlooking some simple method for doing what I
want to do.  Does anyone have a better method?

By the way, imresize(a, 2, ‘nearest’) will do what I want, but this is a
function from the image package and I’m trying to write some routines
that duplicate the functionality of the image package without using any
of those functions.

Thanks

Tony Richardson



_______________________________________________
Help-octave mailing list
address@hidden
https://mailman.cae.wisc.edu/listinfo/help-octave


Hi,

try

kron(a,[1 1 ; 1 1])

for your case n=2. kron is the Kronecker Matrix product.

Regards,
Laurent


reply via email to

[Prev in Thread] Current Thread [Next in Thread]