【问题标题】:compare a cell in a matrix with all the cells in another and store the result in a third matrix将矩阵中的一个单元格与另一个矩阵中的所有单元格进行比较,并将结果存储在第三个矩阵中
【发布时间】:2015-07-20 05:23:24
【问题描述】:

我想比较矩阵 X 中的所有单元格坐标,以便将每个单元格与另一个称为 Yint 的矩阵中的所有坐标进行比较(Yint 包含两列和 65 行,每列代表坐标 (x,y)一个单元格)。

如果 X 中一个单元格的坐标等于 Yint 中的任何坐标,则将 1 否则 0 存储在称为标签的第三个矩阵中。

Yint 中的第 33 行只是 Yint 矩阵中的一个标志,这就是我忽略它的原因。

问题是标签矩阵总是给我零。我认为我的代码有问题。知道 X 中有一些值应该满足条件并将 1 存储在标签矩阵中。

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

标签:65536 X 1

一个简化的例子:

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]

【问题讨论】:

  • 比较标准是什么?请详细说明if 条件应该 表达的内容,因为这肯定是问题所在。
  • 我更新了问题。
  • 对不起,我还是不清楚,你能举一个输入数据的例子和你想要得到的输出吗?
  • 好的,我们想在心脏中找到左心室,所以输入是心脏图像(X),我们已经知道左心室的坐标(Yint),目标是搜索X 中的这些坐标,如果找到,则将 1 存储在矩阵标签 65536x1(X 的所有坐标按线性顺序)中,否则为 0。
  • 第 33 行用于区分心内膜和心外膜轮廓。

标签: matlab


【解决方案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

【讨论】:

  • 不知道sub2ind,你的解决方案肯定比我的更通用
  • @m.s.它是一个基本功能..顺便说一句,我最近也学到了这一点:(我想你需要重塑以匹配 OP 给出的输出。
  • @m.s.当我用你的代码替换我的代码时,我遇到了两个错误:使用 sub2ind 时出错:下标超出范围。 LV 中的错误(第 91 行):Yind = sub2ind(size(X),Yint(:,1),Yint(:,2));
  • @SanthanSalai 是的,您的代码现在运行良好。问题是Yint中第33行的坐标是(0,0),所以它们导致了错误。知道怎么跳吗?
  • 非常感谢你们,你们真的帮了很多忙。关于第 33 行,我将 (0,0) 替换为现有坐标 Yint。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2019-03-14
  • 2015-12-28
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多