MATLAB:仅当条件为真时才向空矩阵添加列

MATLAB: adding columns to an empty matrix only when condition is true

我有一个图像 (orig) 和一个相应的二进制蒙版 (maskD),由垂直 streaks/columns 值零或一组成。我正在尝试制作第三个矩阵(streakTemp),该矩阵仅由图像中掩码中具有 1 值的那些列组成。我正在使用下面的代码,出于某种原因,它把我正在寻找的两列作为输出,然后在掩码值为 0 的地方给出零值……所以我的输出与我的输入图像具有相同的 x 长度...它应该更短,排除了零的掩码值。不知道我做错了什么……有什么想法吗?谢谢!

streakTemp=[];
for i=1:x
    if maskD(1,i)==1
        streakTemp(:,i)=orig(:,i); 
    end
end

imtool(streakTemp);

我想这就是你需要的:

orig  = reshape(1 : 20, 4, 5)
maskD = [1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1; 1 0 0 1 1]
mask1D = maskD(1, :)
x = 5;

streakTemp=[];
for i=1:x
    if maskD(1,i)==1
        streakTemp(:,i)=orig(:,i); 
    end
end
streakTemp

streakTemp2 = orig(:, logical(mask1D))

它输出:

orig =

     1     5     9    13    17
     2     6    10    14    18
     3     7    11    15    19
     4     8    12    16    20


maskD =

     1     0     0     1     1
     1     0     0     1     1
     1     0     0     1     1
     1     0     0     1     1


mask1D =

     1     0     0     1     1


streakTemp =

     1     0     0    13    17
     2     0     0    14    18
     3     0     0    15    19
     4     0     0    16    20


streakTemp2 =

     1    13    17
     2    14    18
     3    15    19
     4    16    20

这里有更多关于 logical indexing 的内容。 请注意,您的 maskD 根本不必是矩阵;你只需要存储第一行,这就是我使用 mask1D.

的原因

您的代码变体应该可以工作:

streakTemp=[];
j=1;
for i=1:x
   if maskD(1,i)==1
      streakTemp(:,j)=orig(:,i); 
      j=j+1;
   end
end

你遇到的问题是 i 索引总是对应于原始矩阵列,因此即使不满足掩码条件也不会跳过该列。

你不应该在这里使用循环。直接逻辑索引完全可以满足您的目的:

streakTemp = orig(:, maskD(1,:) == 1);

请记住,maskD 是一个与原始图像大小相同的蒙版,因此我们只需访问第一行即可进行检查。简而言之,这会查看 maskD 等于 1 的所有列,然后使用相应的位置从 orig 矩阵中进行子采样,以创建一个新矩阵,删除所有不需要的列。