A
是一个矩阵40 x 10000
。 V1
,V2
和V3
是3个具有相同维度1 x 50
的向量。
我想找到满足以下条件的3个向量W1
,W2
和W3
具有相同的维1 X p
(p:最大可能p <= 40) :
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,:)。
答案 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 ...