【问题标题】:Matlab: how to find row indices of a matrix satisfying certain requirements?Matlab:如何找到满足特定要求的矩阵的行索引?
【发布时间】:2014-09-08 09:11:56
【问题描述】:

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

我想找到3个向量W1W2W3,具有相同的维度1 X p(p:最大可能的p

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

Wk 不是已知向量!但 Vk 是预定义的。

所以目标是找到包含 Wk 的 A 的行索引,其中 size(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,:)。

另一个例子:

如果:(如果 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,:)。

另一个例子:

如果:(如果 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,:)。

【问题讨论】:

  • 可以有重复吗,比如W1 =[a b c a]等?
  • @Divakar:不,p 不是预定义的。
  • 我们可以将向量(3)的数量设为固定吗?还是应该是一个可变参数(更难)?
  • @Divakar:目标不是找到 Wk,而是找到矩阵 A、A(i,:) 的行,其中包含 k=1,2,3 的所有 Wk(j) 和对于给定的 j 值。 Wk 只是了解我们想要什么的中间步骤。
  • 每个 W 的所有匹配项都必须在同一列中吗?如果A 中的b 是右侧一列怎么办?

标签: matlab matrix


【解决方案1】:

以下似乎有效。变量result 给出了一组选定的行(例如您的示例中的[2 5 6][2 6])。当然你也可以取A(result,:),也可以取pnumel(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 ...

【讨论】:

  • [1 3 2]”是维度(1:行,2:列,3:切片),而不是向量的条目。它适用于任何行向量(即大小 1 x 不管)
  • 也表示 3D 数组的第三维。它不限制向量的大小。您可能想查看permute(V1, [1 3 2])bsxfun(@eq, A, permute(V1, [1 3 2]))(没有any(...,3))的结果,看看它是如何工作的。这真有趣; bsxfun是一个很强大的功能
  • @bzak 你需要介绍eq4IF 部分可能会到达你家,如果k 大于10 可能。
  • @Divakar 我在 Stack Overflow 上看到过“切片”。可能来自你,是的 :-) 也是“层”
  • @LuisMendo 对不起,我真的很想对 Luis Mendo 解决方案进行编辑;) 请确保编辑看起来不错并产生所需的结果! :)
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2021-06-29
  • 1970-01-01
相关资源
最近更新 更多