条件执行每行中的不同列

时间:2015-05-18 21:59:00

标签: matlab matrix indexing

A = [0,0,1,0,1,0,1,0,0,0;
     0,0,0,0,1,0,1,0,0,0;
     0,0,1,0,1,0,1,0,0,0];

B = [2,5;
     1,6;
     3,10];

预期输出单元阵列:

C = [1,1,1,1;            %// 2-3-4, 3-4-5, 4-5, 5
     0,0,1,1,1,0;        %// 1-2-3, 2-3-4, 3-4-5, 4-5-6, 5-6, 6
     1,1,1,1,1,0,0,0];   %// 3-4-5, 4-5-6, 5-6-7, 7-8-9, 8-9-10, 9-10, 10

矩阵B包括应该使用哪些列来执行矩阵A上的条件。例如,B的第一行是2和5;因此,矩阵A的第2个第5列之间的元素应该用于执行条件。 B的第二行是1和6;所以第1列第6列之间的元素应该用于执行条件。等等...

条件:如果连续3个元素的总和大于或等于1,则将1写入矩阵C;否则写0。例如,A包括0,1,0作为三个连续元素(sum为0 + 1 + 0 = 1),因此将1写入矩阵C.另一个例子,第二行中A的前三个元素为0 ,0,0(sum为0),所以将0写入矩阵C.依此类推......

  

"有时可以只考虑1或2个连续元素。"

例如,A的第一行的条件执行以第5列结束,因此只应考虑第5列的值;这是1.所以1被写入矩阵C。

解释C的第一行:

  

1,因为(A(1,:)的2,3,4个元素的总和)> = 1

     

1,因为(A(1,:)的3,4,5个元素的总和)> = 1

     

由于最大限制为5,因此这里仅采用2个连续元素       1,因为(A(1,:)单独的4,5个元素的总和)> = 1

     

由于最大限制为5,因此这里仅采用1个连续元素       1,因为(A(1,:)的单独的第5个元素的总和)> = 1

没有for循环,只有矩阵运算,我该怎么做这个复杂的任务?或任何技巧?

1 个答案:

答案 0 :(得分:1)

使用mat2cellcellfunim2colany

COPY

您的样本输入:

subMatLen = 3;

%// Converting both A & B matrix to Cell Arrays to perform operations Row-wise
AC = mat2cell(A,ones(1,size(A,1)),size(A,2));
BC = mat2cell(B,ones(1,size(B,1)),size(B,2));

%// Getting only the columns of each rows within the limits specified  by Matrix B
%// Also appended with zeros for my own convenience as it wont affect the 'summing' process
out = cellfun(@(x,y) [x(y(1):y(2)),zeros(1,subMatLen-1)],AC, BC, 'uni', 0);

%// Finally taking each 1x3 sliding sub-matrix and returning 1 if `any` of it is non-zero
%// which is equivalent to summing and checking whether they are >= 1
out = cellfun(@(x) any(im2col(x, [1,subMatLen], 'sliding')), out, 'uni', 0);

<强>输出:

A = [0,0,1,0,1,0,1,0,0,0;
     0,0,0,0,1,0,1,0,0,0;
     0,0,1,0,1,0,1,0,0,0];

B = [2,5;
     1,6;
     3,10];

如果您希望它们作为单行或列矩阵,您可以将其添加到代码的底部:

>> celldisp(out)

out{1} =

 1     1     1     1


out{2} =

 0     0     1     1     1     0


out{3} =

 1     1     1     1     1     0     0     0

out = cat(2,out{:})