【问题标题】:MATLAB: adding columns to an empty matrix only when condition is trueMATLAB:仅在条件为真时向空矩阵添加列
【发布时间】:2016-04-21 08:21:30
【问题描述】:

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

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

imtool(streakTemp);

【问题讨论】:

  • 不,所有的零和一,现在附上

标签: matlab matrix binary mask


【解决方案1】:

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

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

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

【讨论】:

  • 是的,这很好用。我尝试了类似的方法,但在某处切换了 i 或 j 。谢谢!
  • 我不想听起来粗鲁,但我的答案在一行中也是如此,没有循环和额外的变量,因此它更快,使用更少的开销并且更易于阅读。也许您想重新考虑您接受的答案可能是什么:)
  • @bers 我同意。咨询元:meta.stackexchange.com/questions/5234/… ......他们谈论实际回答问题的地方......它谈到选择一个也是好的做法的答案的地方非常令人心酸。
  • 显然@rayryeng 的答案更值得推荐,就代码的简单性和效率而言。
  • @RaymondKwan 如果我不得不选择,我会选择这个答案,因为这需要对 OP 的代码进行很少的更改,而这正是 OP 所追求的。通常,推荐使用逻辑索引。撇开所有事实不谈,做得很好。
【解决方案2】:

我认为这是你需要的:

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的原因。

【讨论】:

  • 我在尝试这个时得到“索引超出矩阵尺寸”
  • 我没有(在 R2015b 中)。在哪一行?此时变量的值是多少?
  • 查看我的编辑。您可能使用了旧的 2-D maskD 而不是我现在称为 mask1D 的 1-D 版本。
【解决方案3】:

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

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

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

【讨论】:

  • 这基本上就是我在回答中所写的内容 :) logical(maskD) 会比 maskD == 1 更快。
  • @bers 抱歉,我没有将其视为您回答的一部分。我被你使用循环分散了注意力,而更优化的答案只是在后台。如果我注意到了,我就不会写这个了。我建议你删除带有循环的代码,这样人们就不会感到困惑......因为我做到了。
猜你喜欢
  • 2011-10-28
  • 2017-03-12
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2010-10-21
相关资源
最近更新 更多