Matrix manipulation syntax help

2 次查看(过去 30 天)
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 个评论
Sean de Wolski
Sean de Wolski 2011-5-10
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.

请先登录,再进行评论。

采纳的回答

Sean de Wolski
Sean de Wolski 2011-5-10
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 个评论
Andy
Andy 2011-5-10
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 2011-5-11
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.

请先登录,再进行评论。

更多回答(3 个)

Sean de Wolski
Sean de Wolski 2011-5-10
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 个评论
Sean de Wolski
Sean de Wolski 2011-5-10
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 2011-5-10
Aren't sparse arrays its main (only for my purposes) use?

请先登录,再进行评论。


Matt Fig
Matt Fig 2011-5-10
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 2011-5-10
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{:}));

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by