2015-01-21 85 views
4

以下脚本给出了矩阵每个元素边界的总和。计算关于彼此相邻的值为1的元素的边界。这个总和的产品被称为联系周长。用于计算矩阵元素之间边界的脚本

但是有没有其他方法可以总结或向量化我的原始简单脚本? 我问这个要求是因为我的实矩阵非常大,使用“for”增加了计算时间。

谢谢。

a1=[1 1 0 1 0 1; 
    0 1 1 0 0 1; 
    1 1 0 1 0 1; 
    1 1 0 0 1 0; 
    0 0 0 1 1 1] 
m=5 
n=6 
cmp=zeros(m,n) 
cmp1=zeros(m,n) 
for i=1:m-1 
    for j=1:n 
     if a1(i,j)==a1(i+1,j) && a1(i,j)==1 
      cmp(i,j)=1 
     end 
    end 
    for i=1:m 
     for j=1:n-1 
      if a1(i,j)==a1(i,j+1) && a1(i,j)==1 
       cmp1(i,j)=1 
      end 
     end 
    end 
end 
cmtotal=cmp+cmp1 
pc=sum(sum(cmtotal)) 

回答

3

这应该是非常有效的一个 -

%// Case1 and case 2 matches 
case1_matches = a1(1:end-1,:) == a1(2:end,:) & a1(1:end-1,:)==1 
case2_matches = a1(:,1:end-1) == a1(:,2:end) & a1(:,1:end-1)==1 

%// Get sum of those matches for the final output, equivalent to your pc 
out = sum(case1_matches(:)) + sum(case2_matches(:)) 

您可以sum(..(:))nnz()取代,但我怀疑,这将是比任何sum更好的运行时性能方面按照benchmarks of sum against nnz

+0

谢谢。它的工作原理。 – user3760558 2015-01-21 10:05:27