gpt4 book ai didi

arrays - 将数组与矩阵中的每一行进行比较(列数可能不同)

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:49 25 4
gpt4 key购买 nike

假设我有一个 7*3 矩阵 t。

>> t=[2,1,3;5,1,9;4,6,1;1,4,6;7,1,5;1,7,4;9,7,5]

t =

2 1 3
5 1 9
4 6 1
1 4 6
7 1 5
1 7 4
9 7 5

和一个像这样有两个值的数组

e=[2,1]

e =

 2     1

我需要知道 t 中的哪一行有值 1 和 2(即矩阵 e 的值)。即,给定一个函数 match(e,t),它应该返回满足此条件的行号。

我写了一个函数匹配,它完成了工作。

function [ faceindex ] = match(e,t)
c=ismember(t,e)
d=sum(c,2)
faceindex=find(d==2)
end

这就是它的工作原理:

match(e,t)

c =

 1     1     0
0 1 0
0 0 1
1 0 0
0 1 0
1 0 0
0 0 0

d =

 2
1
1
1
1
1
0

脸指数=

 1

答案=

 1

但是,我将它用于相当大的输入,它被调用了很多次并且需要一段时间才能运行。 Matlab 的探查器告诉我问题出在这个 ismember 函数上。有什么方法可以更快地进行匹配吗?我愿意接受任何类型的解决方案或提示。也许不需要使用 ismember 来进行检查的东西。请注意,顺序无关紧要。如果 e 是 2,1...该行应该有 1 和 2,并且可以按任何顺序排列。

最佳答案

您说您需要识别 t 中具有值 12 的行(即矩阵 e) 并且你使用了代码 - faceindex=find(d==2),所以我假设 e 是说 [1 2 7],我们必须查找 te 的元素以任意顺序出现的次数计数的行必须等于 3(= e 中的元素数),因此我们必须尝试复制类似 - faceindex=find(d==3) 的内容。我还假设 e 中的值是唯一值。

有了这些要使用的条件集,您可以尝试这种 bsxfun 方法来处理 et 的一般情况 -

mat1 = bsxfun(@eq,t,permute(e,[3 1 2]));
faceindex = find(sum(reshape(mat1,size(t,1),[]),2)==numel(e));

如果我只关注你的话而不是你的代码,让我引用你文本的重要部分 - “我需要知道 t 中的哪一行有值 1 和 2”。从这句话可以推断,你只是想找出t的行号,其中e中的每个元素至少出现一次。因此,根据这个新假设并且 e 中的值是唯一值,您可以尝试对我之前的代码稍加修改的版本 -

mat1 = bsxfun(@eq,t,permute(e,[3 1 2]));
faceindex = find(all(squeeze(any(mat1,2)),2));

因此,请确定您真正想要的是什么,因为我没有看到您的代码会为您的文本说话。

编辑 1:在您的一条评论中,您说 e 中始终只有两个值,而 t 永远不会有重复值, 因此对于这种特定情况,可以使用两种方法。

方法一:

faceindex = find(sum( (t==e(1) | t==e(2)),2 )==2,1);

方法 2(更适合非常大的数据量):

ind1 = find(any(t==e(1),2));
[r,c] = find(t(ind1,:)==e(2),1);
faceindex = ind1(r);

关于arrays - 将数组与矩阵中的每一行进行比较(列数可能不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23864205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com