Matlab 将矩阵中的一个单元格与另一个矩阵中的所有单元格进行比较,并将结果存储在第三个矩阵中
我想比较矩阵X中的所有单元格坐标,这样每个单元格都会与另一个名为Yint的矩阵中的所有坐标进行比较(Yint包含两列和65行,每行代表一个单元格的坐标(X,y)) 如果X中某个单元格的坐标等于Yint中的任何坐标,则将1或0存储在称为标签的第三个矩阵中 Yint中的第33行只是Yint矩阵中的一个标志,这就是我忽略它的原因 问题是标签矩阵总是给我零。我觉得我的代码有问题。知道X中有一些值应该满足条件,并在标签矩阵中存储1Matlab 将矩阵中的一个单元格与另一个矩阵中的所有单元格进行比较,并将结果存储在第三个矩阵中,matlab,Matlab,我想比较矩阵X中的所有单元格坐标,这样每个单元格都会与另一个名为Yint的矩阵中的所有坐标进行比较(Yint包含两列和65行,每行代表一个单元格的坐标(X,y)) 如果X中某个单元格的坐标等于Yint中的任何坐标,则将1或0存储在称为标签的第三个矩阵中 Yint中的第33行只是Yint矩阵中的一个标志,这就是我忽略它的原因 问题是标签矩阵总是给我零。我觉得我的代码有问题。知道X中有一些值应该满足条件,并在标签矩阵中存储1 labels = zeros(65536, 1); Yint= rou
labels = zeros(65536, 1);
Yint= round (Y);
counter=1;
for row = 1:1:rows
for col = 1:1:cols
pointer=1;
for pointer=1:1:65
if (isequal(row , Yint(pointer,1)) && isequal(col , Yint(pointer,2)) && pointer ~= 33)
labels(counter) = 1;
else
labels(counter) = 0;
end
end
counter=counter+1;
end
end
矩阵行X列:
银币:65 X 2
X:256 X 256
标签:65536x1
一个简化的例子:
X = [3 5 3;
2 7 4;
1 7 2]
Yint = [1 1;
2 3;
3 3]
标签矩阵可视为:
labels = [1 0 0;
0 0 1;
0 0 1]
然而,我们希望它是一个向量(9x1),我们得到的是:
labels = [1;
0;
0;
0;
0;
1;
0;
0;
1]
对于给定的示例和预期结果,这应该是可行的:
Yind = sub2ind(size(X),Yint(:,1),Yint(:,2));
out = zeros(size(X));
out(Yind) = 1;
out = reshape(out.',1,[]).';
结果:
输入:
X = [3 5 3;
2 7 4;
1 7 2];
Yint = [1 1;
2 3;
3 3];
输出:
out =
1
0
0
0
0
1
0
0
1
如果要匹配所有引用而不是位置,则需要额外的工作
Yind = sub2ind(size(X),Yint(:,1),Yint(:,2));
out = arrayfun(@(x) any(x == X(Yind)),X);
您的输出(对于相同的输入)如下所示:
>> out
out =
1 0 1
1 0 1
0 0 1
您可以根据需要对其进行重塑:
out = reshape(out.',1,[]).';
重塑后:
>> out
out =
1
0
1
1
0
1
0
0
1
比较标准是什么?请详细说明
if
条件应该表达什么,因为这是问题最明显的地方。我更新了问题。对不起,我仍然不清楚,你能给出一个输入数据和想要得到的输出的例子吗?好的,我们想找到心脏中的左心室,所以输入是心脏图像(X)我们已经知道左心室(Yint)的坐标,目标是在X中搜索这些坐标,如果找到,则在矩阵标签65536x1中存储1(所有X的坐标以线性顺序),否则为0。第33行是区分心内膜和心外膜轮廓。不知道sub2in
,您的解决方案肯定比mine@m.s.这是一项基本功能。。顺便说一句,我最近也学到了这一点:(我想你的代码需要重塑以匹配OP.@m.s.给出的输出。当我用你的代码替换我的代码时,我遇到了两个错误:使用sub2ind:Out-range下标时出错。LV(第91行)中的错误:Yind=sub2ind(size(X),Yint(:,1),Yint(:,2));@SanthanSalai是的,你的代码现在运行得很好。问题是Yint中第33行的坐标是(0,0),所以他们导致了错误。知道如何跳过它吗?非常感谢你们,你们真的帮了很多忙。关于第33行,我用现有的坐标替换了(0,0)Yint。