在Matlab中计算矩阵每行的子行数?

时间:2014-05-07 20:43:12

标签: matrix count grouping matlab

我需要在Matlab中使用一种算法来计算矩阵(1,1)的每一行中有多少相邻和非重叠A mx(n*2)而不使用循环。 E.g。

A=[1 1 1 0 1 1 0 0 0 1; 1 0 1 1 1 1 0 0 1 1]  %m=2, n=5

然后我想要

B=[2;3] %mx1

4 个答案:

答案 0 :(得分:3)

具体案例

假设A只有1和0,这可能是一种方式 -

B = sum(reshape(sum(reshape(A',2,[]))==2,size(A,2)/2,[]))

一般情况

如果您正在寻找一种必须适用于所有整数的通用方法以及可以指定数字模式的情况,您可以使用它 -

patt = [0 1] %%// pattern to be found out
B = sum(reshape(ismember(reshape(A',2,[])',patt,'rows'),[],2))

<强>输出

patt = [1 1]B = [2 3]

patt = [0 1]B = [1 0]

答案 1 :(得分:1)

您可以使用imresize,例如

  imresize(A,[size(A,1),size(A,2)/2])>0.8

ans =
 1     0     1     0     0
 0     1     1     0     1

这会将1放置在[1 1]对的位置......然后您可以使用sum

对于任何对类型[x y],您可以:

x=0; y=1;
R(size(A,1),size(A,2)/2)=0; % prealocarting memory

 for n=1:size(A,1)
    b=[A(n,1:2:end)'  A(n,2:2:end)']
    try
       R(n,find(b(:,1)==x & b(:,2)==y))=1;
    end

end

R =
 0     0     0     0     1
 0     0     0     0     0

答案 2 :(得分:1)

你可以使用转置然后重塑,所以每个连续的值现在都在一行,然后比较顶行和底行(布尔比较或比较每行的总和为2),然后求和的结果和重塑结果你喜欢。

在代码中,它看起来像:

A=[1 1 1 0 1 1 0 0 0 1; 1 0 1 1 1 1 0 0 1 1] ;
m = size(A,1) ;
n = size(A,2)/2 ;

Atemp = reshape(A.' , 2 , [] , m ) ;
B = squeeze(sum(sum(Atemp)==2))

<小时/> 如果需要,您可以将所有内容打包在一行代码中,但通常更容易理解几行。为清楚起见,Atemp矩阵看起来像这样:

Atemp(:,:,1) =
     1     1     1     0     0
     1     0     1     0     1
Atemp(:,:,2) =
     1     1     1     0     1
     0     1     1     0     1

您会注意到原始A矩阵的每一行都按元素分为2行。第二行将简单地将每行的总和与2进行比较,然后对比较的有效结果求和。 squeeze命令只是为了删除不再需要的单例维度。

答案 3 :(得分:0)

使用diff(以检测每次运行的开始和结束)和accumarray(对同一行的运行进行分组;每次运行将其长度的一半向下舍入):

B = diff([zeros(1,size(A,1)); A.'; zeros(1,size(A,1))]); %'// columnwise is easier
[is js] = find(B==1); %// rows and columns of starts of runs of ones
[ie je] = find(B==-1); %// rows and columns of ends of runs of ones
result = accumarray(js, floor((ie-is)/2)); %// sum values for each row of A