我想在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。任何有关这方面的帮助将非常感谢!感谢。
答案 0 :(得分:0)
确切地说,您想要做什么,但要搜索矩阵中的值,您可以使用find:
for i = 1:numel(tmp)
[row, col] = find(id == tmp(i));
end
答案 1 :(得分:0)
您可以使用bsxfun
和permute
的组合轻松实现此目的。您要做的是转换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
数字来描述此内容。这可以使用此矩阵上的ind2sub
和find
轻松完成:
id
因此,[rows, cols, ID] = ind2sub(size(tmp3), find(tmp3))
rows =
1
3
cols =
2
2
ID =
1
3
会告诉您我们匹配了哪个ID
,id
,rows
会告诉您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=2
,id=3
,我们在tmp(3) = 2290
希望这有帮助!