以下脚本给出了矩阵每个元素的边界总和。计算关于值为1的元素彼此相邻的边界。该总和的乘积称为接触周长。
但有没有其他方法可以总结或矢量化我原始和简单的脚本? 我问这个请求,因为我的真实矩阵非常大,使用"用于"增加计算时间。
谢谢。
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))
答案 0 :(得分: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
强>