Matrix manipulation syntax help
이전 댓글 표시
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
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.
채택된 답변
추가 답변 (3개)
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
Matt Tearle
2011년 5월 10일
Of course you actually meant
n = nnz(conv2(double(white),ones(3),'valid')==9);
:)
Sean de Wolski
2011년 5월 10일
Eww. No. nnz is super slow, avoid it like the plague:
t1 = 0;
t2 = 0;
white = rand(2048)>.4;
for ii = 1:10
tic
n1 = sum(sum(conv2(double(white),ones(3),'valid')==9));
t1 = t1+toc;
tic
n2 = nnz(conv2(double(white),ones(3),'valid')==9);
t2 = t2+toc;
end
disp([t1 t2])
Matt Fig
2011년 5월 10일
It's a shame too. Because the NNZ solution looks so much cleaner and is easier to read.
Walter Roberson
2011년 5월 10일
I thought nnz() was the preferred form?
On my system, nnz() is only about 2% slower in the above test. And nnz() would be considerably faster than double-sum on sparse arrays.
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
2011년 5월 10일
Aren't sparse arrays its main (only for my purposes) use?
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
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{:}));
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!