I have AB matrix that contains 3000x2000 grids data.
AB =
(1,1) (1,2) (1,3) (1,4) ... (1,3000)
(2,1) (2,2) (2,3) (2,4) ... (2,3000)
(3,1) (3,2) (3,3) (3,4) ... (3,3000)
(4,1) (4,2) (4,3) (4,4) ... (4,3000)
(5,1) (5,2) (5,3) (5,4) ... (5,3000)
...
...
...
(2000,1)
I want to calculate (MAX-MIN) value for each 3x5 grids in matrix AB
For Example :
If target grid is (3,2), I use 15 grids data (1~5,1~3) for calculation of MAX and MIN.
And if MAX is (1,1) and MIN is (2,3), then (MAX-MIN) at (3,2) is ((1,1)-(2,3)).
In the same way, if target grid is (3,3), I use (1~5,2~4).
Can you help me to make automatic script to calculate this??

2 comentarios

Stephen23
Stephen23 el 6 de En. de 2017
@Ashvin Hamzah Driwantara: your question is not clear. Please edit your question and provide us with complete input and output examples so that we can write and test code.
Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
thankyou,, i have edited it

Iniciar sesión para comentar.

 Respuesta aceptada

Stephen23
Stephen23 el 6 de En. de 2017
Editada: Stephen23 el 6 de En. de 2017

0 votos

blockproc might do what you want:
>> X = rand(3000,2000);
>> Xmax = blockproc(X,[3,5],@(s)max(s.data(:)));
>> Xmin = blockproc(X,[3,5],@(s)min(s.data(:)));
>> Xdif = Xmax - Xmin;

5 comentarios

Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
Editada: Ashvin Hamzah Driwantara el 6 de En. de 2017
thanks my friend,, I will try later,, please help me if I face some problem
How to calculate average and standard deviation at same case?
Stephen23
Stephen23 el 6 de En. de 2017
Use blockproc with mean and std.
Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
so i just replace @min with @mean or @std?
Stephen23
Stephen23 el 6 de En. de 2017
@Ashvin Hamzah Driwantara: have a look at my revised answer. You will need to change the function inside the anonymous function:
@(s)std(s.data(:))
Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 7 de En. de 2017
I'm using 5x5 grids, and calculation start from grid (3,3)...
how to calculate grid on (1,1)?

Iniciar sesión para comentar.

Más respuestas (4)

Guillaume
Guillaume el 6 de En. de 2017

1 voto

I believe Ashvin is looking for nlfilter rather than blockproc. I.e., he wants sliding overlapping blocs instead of adjacent blocks. So:
nlfilter(X, [3 5], @(block) std(block(:)));

1 comentario

Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
Editada: Ashvin Hamzah Driwantara el 6 de En. de 2017
it works,, but it takes a long time...
how about using colfilt?
can you help me, sir?

Iniciar sesión para comentar.

Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017

0 votos

I get an error
BLOCKPROC encountered an error while evaluating the user-supplied function handle, FUN.
The cause of the error was:
Undefined function 'min' for input arguments of type 'struct'.
Error in blockprocFunDispatcher (line 13)
output_block = fun(block_struct);
Error in blockprocInMemory (line 80)
[ul_output fun_nargout] = blockprocFunDispatcher(fun,block_struct,...
Error in blockproc (line 242)
result_image = blockprocInMemory(source,fun,options);
please help

6 comentarios

Stephen23
Stephen23 el 6 de En. de 2017
@Ashvin Hamzah Driwantara: read my answer and comments again.
Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
Editada: Ashvin Hamzah Driwantara el 6 de En. de 2017
okay thankyou, the script works...
but it decreases the matrix...
how can I calculate the MAX-MIN without decrease the matrix?
for example : matrix AB = 3000x2000, I want to get the output 3000x2000 too... Is it possible?
Stephen23
Stephen23 el 6 de En. de 2017
@Ashvin Hamzah Driwantara: do you wish for all pixels within one block to have the same value?
Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
no, I think each pixel has different block, but maybe some pixel can't calculate, like pixel (1,1)
Stephen23
Stephen23 el 6 de En. de 2017
Editada: Stephen23 el 7 de En. de 2017
@Ashvin Hamzah Driwantara: your explanation is not clear. If each block does not generate one value, then you will need to explain in more detail, and provide input and output sample matrices so that we can test code. Until you provide a clear explanation of what you want there is nothing more that I can do for you.
Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 6 de En. de 2017
yes, I'm sorry... the matrix is from nc file...
do you know how to solve the problem using colfilt?
because nlfilter takes a long time

Iniciar sesión para comentar.

Ashvin Hamzah Driwantara
Ashvin Hamzah Driwantara el 7 de En. de 2017

0 votos

I have solved my problem using this script
c13 = matrix 3000x2000
matrix_WV=c13;
[tinggi,lebar]=size(matrix_WV);
maxmin=zeros(tinggi,lebar);
for i=1:tinggi
for j=1:lebar
%fprintf('hitung grid ke (%d,%d)\n',i,j);
n=0;
for tempi=-2:2
for tempj=-2:2
if i+tempi>=1 && i+tempi<=tinggi && j+tempj>=1 && j+tempj<=lebar
n=n+1;
area5x5(n)=matrix_WV(i+tempi,j+tempj);
end
end
end
max=area5x5(1);
min=area5x5(1);
for k=1:n
if max<area5x5(k)
max=area5x5(k);
end
if min>area5x5(k)
min=area5x5(k);
end
end
maxmin(i,j)=max-min;
end
end
%fprintf('done\n');
Zeeshan Salam
Zeeshan Salam el 24 de Mzo. de 2019

0 votos

i=3:3:smax what is meaning of this?

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by