Matlab:如何找到满足一定要求的矩阵的行索引?

时间:2014-07-17 13:10:11

标签: matlab matrix

A是一个矩阵40 x 10000V1V2V3是3个具有相同维度1 x 50的向量。

我想找到满足以下条件的3个向量W1W2W3具有相同的维1 X p(p:最大可能p <= 40) :

  • W1(i),W2(i)和W3(i)属于A(i,:)
  • Wk的所有元素属于Vk,k = 1,2,3

Wk不是已知的载体!但是Vk是预定义的。

所以目标是找到包含Wk的A的行索引,其中大小(Wk)是最大的。

示例:(我在矩阵中使用了一些字符来使示例更清晰)

      95    45    92    41    13     1    84
       a     1     e    89     h    74    52
A=    60    82    17     5    19    44    20
      48    44    40    35    67    93    67
       b    61     f    81     m    46    83
       c    79     g    20     n    41     1

V1 = [51 a 23 11 b 5 c]

V2 = [e g 93 14 22 f 10]

V3 = [81 n 87 h 45 77 m]

这个例子p=3(最大可能值)所以:

W1 =[a b c]

W2 =[e f g]

W3 =[h m n]

所需的结果:A(2,:),A(5,:)和A(6,:)。

另一个例子:

如果:

      95    45    92    41    13     1    84
       a     1     e    89     h    74    52
A=    60    82    17     5    19    44    20
       b    44    40    35    67    93    67
      48    61     f    81     m    46    83
       c    79     g    20     n    41     1

V1 = [51 a 23 11 b 5 c]

V2 = [e g 93 14 22 f 10]

V3 = [81 n 87 h 45 77 m]

示例p=2(最大可能值);因为48不属于V1,而40和67分别不属于V2和V3,所以:

W1 =[a c]

W2 =[e g]

W3 =[h n]

期望的结果:A(2,:)和A(6,:)。

另一个例子:

if :(如果A中的b是右边的一列)

      95    45    92    41    13     1    84
       a     1     e    89     h    74    52
A=    60    82    17     5    19    44    20
      77     b    40    35    67    93    67
      48    61     f    81     m    46    83
       c    79     g    20     n    41     1

V1 = [51 a 23 11 b 5 c]

V2 = [e g 93 14 22 f 10]

V3 = [81 n 87 h 45 77 m]

对于此示例p=2(可能的最大值),所以:

W1 =[a c]

W2 =[e g]

W3 =[h n]

期望的结果:A(2,:)和A(6,:)。

另一个例子:

if :(如果A中的c是右边的一列)

      95    45    92    41    13     1    84
       a     1     e    89     h    74    52
A=    60    82    17     5    19    44    20
       b    44    40    35    67    93    67
      48    61     f    81     m    46    83
      88     c     g    20     n    41     1

V1 = [51 a 23 11 b 5 c]

V2 = [e g 93 14 22 f 10]

V3 = [81 n 87 h 45 77 m]

示例p=1(最大可能值);这样:

W1 =[a]

W2 =[e]

W3 =[h]

期望的结果:A(2,:)。

1 个答案:

答案 0 :(得分:3)

以下似乎有效。变量result提供了一组选定的行(例如示例中的[2 5 6][2 6])。当然,您可以A(result,:),或p获取numel(result)

eq1 = any(bsxfun(@eq, A, permute(V1, [1 3 2])), 3); %// does entry of A match V1?
eq2 = any(bsxfun(@eq, A, permute(V2, [1 3 2])), 3); %// ...V2?
eq3 = any(bsxfun(@eq, A, permute(V3, [1 3 2])), 3); %// ...V3?
result = [];
for nr = 1:size(A,1) %// try all numbers of rows, in ascending order
    rows = nchoosek(1:size(A,1),nr).'; %'// all combinations of that nr rows
    for rr = rows %// try each combination of nr rows
        if any(all(eq1(rr,:),1)) & any(all(eq2(rr,:),1)) & any(all(eq3(rr,:),1))
            %// ",1" needed to make "all" by columns even if there's only one row
            result = rr; %// (overw)rite result (nr is larger now)
            break %// no need to keep trying combinations of rows for this nr
        end
    end
end

一般情况:当你有超过3个向量时,你可以进行这些更改,这样你的代码看起来很简洁 -

%// Concatenate all V vectors into one
V = cat(1,V1,V2,V3,V4,V5,...)

%// Replace eq1, eq2 and eq3 calculations with this single calculation
eqa = squeeze(any(bsxfun(@eq,A,permute(V,[4 3 2 1])),3));

%// Replace the `IF` part with -
if all(any(all(eqa(rr,:,:),1)),3), result = rr, break, end ...