比较Matlab中不等矩阵的值

时间:2014-11-29 23:46:22

标签: matlab

我想在Matlab中比较两个不等矩阵的行,并提取这些行以存储在不同的矩阵中(比方说D)。例如,

tmp = [2245; 2345; 2290; 4576] 

id=[1 2245 564 8890 123; 
    2 2445 5673 7846 342; 
    3 2290 3428 3321 908]. 

Id是一个更大的矩阵。我想找到'id'中tmp的每个值。虽然在下面的行中使用了交叉命令,但我已经能够找到包含来自tmp的值的id行,我想逐个为tmp的每个值执行此操作,因为tmp的每个值都重复多次ID。我尝试过使用foreach。但是,我收到一条错误消息,指出foreach不能用于char类型数组。任何人都可以建议一个替代方法如何解决这个问题?

for j=1:length(tmp);
[D,itmp,id2] = intersect(tmp(j,1),id(:,2), 'rows');

尽管使用了循环,但代码似乎一次不占用j的一个值。这就是尝试'foreach j'背后的原因。在找到两个矩阵共有的行并将它们存储在D中之后,我想附加矩阵id以在id中的相关行旁边包含j的值。例如,如果tmp中的第一个值在行1,3,5,10中的id中重复;我想在id中使用第1,3,5,10行旁边的值1。任何有关这方面的帮助将非常感谢!感谢。

2 个答案:

答案 0 :(得分:0)

确切地说,您想要做什么,但要搜索矩阵中的值,您可以使用find

  for i = 1:numel(tmp)        
    [row, col] = find(id == tmp(i));             
  end

答案 1 :(得分:0)

您可以使用bsxfunpermute的组合轻松实现此目的。您要做的是转换tmp向量,使其成为单个3D向量,然后使用eq(等于)函数,并查看矩阵中的哪些值等于{{1}的每个值}}。因此,请执行以下操作:

tmp

这是我得到的最终输出,存储在%// Your data id=[1 2245 564 8890 123; 2 2445 5673 7846 342; 3 2290 3428 3321 908] tmp = [2245; 2345; 2290; 4576]; tmp2 = permute(tmp, [3 2 1]); %// Make a 3D vector tmp3 = bsxfun(@eq, id, tmp2); %// Find which locations of id are equal to each value of tmp

tmp3

正如您在此处所见,每个3D切片都会告诉您tmp3(:,:,1) = 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 tmp3(:,:,2) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 tmp3(:,:,3) = 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 tmp3(:,:,4) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 中的哪些元素与id中的相应值相匹配。因此,第一个切片会告诉您tmp中的任何元素是否等于id,即2245.在这种情况下,这将是第一行和第二列。对于第二个切片,没有值匹配tmp(1)。对于第三个切片,tmp(2) = 2345中的一个值与id匹配,即第3行第3列。

现在,您真正想要的是确定tmp(3) = 2290中每个值与tmp中每个位置匹配的行和列。您希望根据id数字来描述此内容。这可以使用此矩阵上的ind2subfind轻松完成:

id

因此,[rows, cols, ID] = ind2sub(size(tmp3), find(tmp3)) rows = 1 3 cols = 2 2 ID = 1 3 会告诉您我们匹配了哪个IDidrows会告诉您cols我们能够使用哪些行和列匹配。因此,对于id,我们发现与id = 1匹配,并且位于tmp(1)= 2245。同样,对于row=1,col=2,我们找到了与id = 3匹配的内容,该内容位于tmp(3)=2290

要将其整合到包含所需信息的所有大型二维矩阵中,您只需将所有这些列连接成一个矩阵即可。因此:

row=3,col=2

您可以这样阅读:

  • final = [ID rows cols] final = 1 1 2 3 3 2 id=1,我们在tmp(1) = 2245中找到了此值。
  • row=1,col=2id=3,我们在tmp(3) = 2290
  • 中找到了此值

希望这有帮助!