对于给定的(0,1)向量,在matlab中返回该矩阵的每一行的所有(1,0)对的索引

时间:2015-06-30 20:33:43

标签: matlab matrix

假设输入是以下矩阵,

[0,1,0,1;
 1,0,1,0]

然后,预期输出为(1,2,1), (1,2,3) (1,4,1), (1,4,3), (2,1,2) (2,1,4), (2,3,2), (2,3,4) 原因是:在第一行中,有四对有序(1,0)对,其索引为(2,1), (2,3), (4,1) and (4,3).。类似地,在第二行中,有四个有序(1,0)对,其索引为(1,2), (1,4), (3,2) and (3,4). 我现在如何在matlab中逐行编码。

>> a=[ 0,1,0,1; 1,0,1,0]

a =

     0     1     0     1
     1     0     1     0

>> b=a(1,:);
>> b

b =

     0     1     0     1

>> x1=find(b==1)

x1 =

     2     4

>> x0=find(b==0)

x0 =

     1     3

>> [X,Y]=meshgrid(x1,x0);
>> c=[X(:),Y(:)]

c =

     2     1
     2     3
     4     1
     4     3

>> d=[ repmat(1, [4,1])  c  ]

d =

     1     2     1
     1     2     3
     1     4     1
     1     4     3

使用for循环,可以解决这个问题。我的问题是:你认为你可以在没有for循环的matlab中编码吗?很多时间和关注。

1 个答案:

答案 0 :(得分:0)

您可以通过巧妙地使用meshgrid来完成此操作。

a = [0,1,0,1;1,0,1,0];
[r0, c0] = ind2sub(size(a), find(a == 0)); % row and column of every 0
[r1, c1] = ind2sub(size(a), find(a == 1)); % row and column of every 1
[R0, R1] = meshgrid(r0, r1);
[C0, C1] = meshgrid(c0, c1);
idx = (R0 == R1); % consider only entries whose rows match
list = [R0(idx), C1(idx), C0(idx)]

输出:

list =

     1     2     1
     1     4     1
     2     1     2
     2     3     2
     1     2     3
     1     4     3
     2     1     4
     2     3     4