【问题标题】:Comparing values across unequal matrices in Matlab在 Matlab 中比较不等矩阵的值
【发布时间】:2014-11-30 09:34:14
【问题描述】:

我想在 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 值。尽管在下面的行中使用 intersect 命令,我已经能够找到包含 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。对此的任何帮助将不胜感激!谢谢。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    不确定你想做什么,但要在矩阵中搜索一个值,你可以使用find

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

    【讨论】:

      【解决方案2】:

      您可以使用bsxfunpermute 的组合轻松实现此目的。您要做的是将tmp 向量转换为单个3D 向量,然后使用eq(等于)函数并查看矩阵中的哪些值等于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

      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
      

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

      现在,您真正需要的是确定tmp 的每个值与id 中的每个位置匹配的行和列。您希望按id 编号对此进行描述。在这个矩阵上使用ind2subfind 很容易做到这一点:

      [rows, cols, ID] = ind2sub(size(tmp3), find(tmp3))
      
      rows =
      
           1
           3
      
      
      cols =
      
           2
           2
      
      
      ID =
      
           1
           3
      

      因此,ID 告诉您我们匹配到了哪个idrowscols 告诉您我们能够匹配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=1tmp(1) = 2245,我们在 row=1,col=2 中找到了这个值。
      • id=3,与tmp(3) = 2290,我们在row=3,col=2 中找到了这个值

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多