Hi
I have an array:
A=rand(1200, 1200);
I'd like to resize this array by half size. I found the resizem function and it works:
B=resizem(A, 0.5);
However, I felt this function is quite slow. I guess that there might be a faster function to do this. Could you help me?
Thanks!
|
|
0
|
|
|
|
Reply
|
Young
|
12/4/2009 6:44:06 PM |
|
On Dec 4, 12:44=A0pm, "Young Ryu" <ryuy...@gmail.com> wrote:
> Hi
>
> I have an array:
> A=3Drand(1200, 1200);
>
> I'd like to resize this array by half size. I found the resizem function =
and it works:
>
> B=3Dresizem(A, 0.5);
>
> However, I felt this function is quite slow. I guess that there might be =
a faster function to do this. Could you help me?
>
> Thanks!
If you want ever other value, for example, you can use:
A=3Drand(1200,1200);
B=3DA(1:2:end,1:2:end);
|
|
0
|
|
|
|
Reply
|
Frank
|
12/4/2009 7:06:53 PM
|
|
I don't have the resizem function.This code does what resize(A,.5) does, don't know if faster...
A=rand(1200);
s=size(A);
i1=(1:ceil(s(1)/2)).*2;
i2=(1:ceil(s(2)/2)).*2;
B=A(i1,i2);
"Young Ryu" <ryuyr77@gmail.com> wrote in message <hfbl9m$pv1$1@fred.mathworks.com>...
> Hi
>
> I have an array:
> A=rand(1200, 1200);
>
> I'd like to resize this array by half size. I found the resizem function and it works:
>
> B=resizem(A, 0.5);
>
> However, I felt this function is quite slow. I guess that there might be a faster function to do this. Could you help me?
>
> Thanks!
|
|
0
|
|
|
|
Reply
|
Lorenzo
|
12/4/2009 7:10:25 PM
|
|
"Young Ryu" <ryuyr77@gmail.com> wrote in message <hfbl9m$pv1$1@fred.mathworks.com>...
Here's a function for downsampling, but it works only when the new pixel sizes are integer multiples of the old ones. If this is enough for you, it might be faster than resizem, if the latter is trying to do something interpolation-based.
function M=downsamp2d(M,bindims)
%DOWNSAMP2D - simple tool for 2D downsampling
%
% M=downsamp2d(M,bindims)
%
%in:
%
% M: a matrix
% bindims: a vector [p,q] specifying pxq downsampling
%
%out:
%
% M: the downsized matrix
p=bindims(1); q=bindims(2);
[m,n]=size(M); %M is the original matrix
M=sum( reshape(M,p,[]) ,1 );
M=reshape(M,m/p,[]).'; %Note transpose
M=sum( reshape(M,q,[]) ,1);
M=reshape(M,n/q,[]).'; %Note transpose
M=M/(p*q);
|
|
0
|
|
|
|
Reply
|
Matt
|
12/4/2009 7:28:09 PM
|
|
Works like a champ. You the man!!
"Matt J" wrote in message <hfbns9$90v$1@fred.mathworks.com>...
> "Young Ryu" <ryuyr77@gmail.com> wrote in message <hfbl9m$pv1$1@fred.mathworks.com>...
>
> Here's a function for downsampling, but it works only when the new pixel sizes are integer multiples of the old ones. If this is enough for you, it might be faster than resizem, if the latter is trying to do something interpolation-based.
>
> function M=downsamp2d(M,bindims)
> %DOWNSAMP2D - simple tool for 2D downsampling
> %
> % M=downsamp2d(M,bindims)
> %
> %in:
> %
> % M: a matrix
> % bindims: a vector [p,q] specifying pxq downsampling
> %
> %out:
> %
> % M: the downsized matrix
>
> p=bindims(1); q=bindims(2);
> [m,n]=size(M); %M is the original matrix
>
> M=sum( reshape(M,p,[]) ,1 );
> M=reshape(M,m/p,[]).'; %Note transpose
>
> M=sum( reshape(M,q,[]) ,1);
> M=reshape(M,n/q,[]).'; %Note transpose
>
> M=M/(p*q);
|
|
0
|
|
|
|
Reply
|
dbeirne (2)
|
6/14/2012 2:39:08 PM
|
|
"Deanna" wrote in message <jrct2c$jbi$1@newscl01ah.mathworks.com>...
>
>
> Works like a champ. You the man!!
==================
That's kind of you, Deanna, but since that post several years ago the Newsgroup has discussed still more efficient ways to do this. The function below (bin2d) is even faster and more memory efficient (using a method proposed by Bruno Luong, if I recall correctly). Both downsamp2d and bin2d are only appropriate for non-sparse arrays, incidentally.
M=rand(5000);
bindims=[2,2];
tic;
m1=downsamp2d(M,bindims);
toc;
%Elapsed time is 0.311892 seconds.
tic;
m2=bin2d(M,bindims);
toc;
%Elapsed time is 0.184764 seconds.
function M=bin2d(M,bindims)
%BIN2D - simple tool for 2D downsampling
%
% M=downsamp2d(M,bindims)
%
%in:
%
% M: a matrix
% bindims: a vector [p,q] specifying pxq downsampling
%
%out:
%
% M: the downsized matrix
p=bindims(1);
q=bindims(2);
[m,n]=size(M); %M is the original matrix
newdims=[m/p,n/q];
M=reshape(M,p,newdims(1),q,newdims(2));
M=sum(sum(M,1),3)/(p*q);
M=reshape(M,newdims);
|
|
0
|
|
|
|
Reply
|
mattjacREMOVE (3177)
|
6/14/2012 3:29:07 PM
|
|
"Matt J" wrote in message <jrd003$3kb$1@newscl01ah.mathworks.com>...
>
> M=sum(sum(M,1),3)/(p*q);
Better still, make this
M=mean(mean(M,1),3);
|
|
0
|
|
|
|
Reply
|
mattjacREMOVE (3177)
|
6/14/2012 4:03:07 PM
|
|
|
6 Replies
437 Views
(page loaded in 0.073 seconds)
|