Matrix manipulation syntax help

2 visualizaciones (últimos 30 días)
Derek
Derek el 10 de Mayo de 2011
Hey, I have a 2048x2048 matrix with values of either 0 or 1 which is called "white". I need to find the total number of 3x3 blocks in the matrix where each data point has a value of 1, ie,
1 1 1
1 1 1
1 1 1
Im a first time user and I think that my problem is syntax. My code is as follows,
x=0
for i=2:2047 j=2:2047
if white(i-1,j-1)==1 & white(i-1,j)==1 & white(i-1,j+1)==1 & white(i,j-1)==1 & white(i,j)==1 & white(i,j+1)==1 & white(i+1,j-1)==1 & white(i+1,j)==1 & white(i+1,j+1)==1
x=x+1
end
y=sum(x)
end
Ive been at it for a few hours and any help would be really appreciated. Ill be spending the rest of the afternoon trying to solve this problem....
Thanks for your help!
  1 comentario
Sean de Wolski
Sean de Wolski el 10 de Mayo de 2011
Welcome to MATLAB answers. Your post is well written, you provide: an example, what you've tried, and what you want - everything we typically request.

Iniciar sesión para comentar.

Respuesta aceptada

Sean de Wolski
Sean de Wolski el 10 de Mayo de 2011
You could do this with your for-loop like this:
n = 0;
for ii = 2:2047
for jj = 2:2047
if(all(all(white(ii-1:ii+1,jj-1:jj+1))))
n = n+1;
end
end
end
  2 comentarios
Andy
Andy el 10 de Mayo de 2011
Derek, also take note of Sean's index variables: ii and jj. If you use i and j as index variables, you overwrite the complex unit i = j = sqrt(-1). Instead, it is common to use ii, jj, ix, and jx as indexing variables for loops, so as to leave i and j for complex computations.
Derek
Derek el 11 de Mayo de 2011
Thanks for your help! I had to make some changes to my original code, but your answer served as a great template for me. I just started a summer job where I will be doing lots of Matlab. This forum is great, thanks again.

Iniciar sesión para comentar.

Más respuestas (3)

Sean de Wolski
Sean de Wolski el 10 de Mayo de 2011
This will probably frustrate you, but here's a one-liner to do exactly what you want!
n = sum(sum(conv2(double(white),ones(3),'valid')==9));
Algorithm:
  • convolve the "white" matrix with a kernel of ones the size you want. Only valid applications apply.
  • It will only equal 9 when all of the values in white matching the kernel are == 1 (i.e. (1*1)*9).
  • sum it twice to get the total number.
  • Enjoy a coffee.
  6 comentarios
Sean de Wolski
Sean de Wolski el 10 de Mayo de 2011
That's why I keep a handy little one line function around vec
function x = vec(x)
x = reshape(x,numel(x),1);
Then sum(vec(...)) %At least no double sum because those are clumsy
Sean de Wolski
Sean de Wolski el 10 de Mayo de 2011
Aren't sparse arrays its main (only for my purposes) use?

Iniciar sesión para comentar.


Matt Fig
Matt Fig el 10 de Mayo de 2011
Another suggestion:
x2 = length(findsubmat(white,ones(3)));
Also, as far as your code, you were close. This works:
x = 0;
for ii = 2:2047
for jj = 2:2047
if white(ii-1,jj-1) & white(ii-1,jj) &...
white(ii-1,jj+1) & white(ii,jj-1) &...
white(ii,jj) & white(ii,jj+1) &...
white(ii+1,jj-1) & white(ii+1,jj) &...
white(ii+1,jj+1) %#ok
x = x+1;
end
end
end

Andrei Bobrov
Andrei Bobrov el 10 de Mayo de 2011
more
mn = size(white)-2;
C = arrayfun(@(k)cumsum([1:3;ones(k,3)]),mn,'un',0);
C2 = arrayfun(@(s)cumsum(ones(mn),s),[1 2],'un',0);
x = nnz(arrayfun(@(i,j)all(all(white(C{1}(i,:),C{2}(j,:)))),C2{:}));

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by