【问题标题】:how can i change value of 3d matrix where it has zero in all layer in matlab?如何更改 3d 矩阵的值,它在 matlab 的所有层中都为零?
【发布时间】:2014-01-14 06:42:11
【问题描述】:

假设我得到了矩阵,称为 mat。

mat(:,:,1) =

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

mat(:,:,2) =

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

mat(:,:,3) =

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

我想更改所有 3 层中为零的每一层的值。

mat_result(:,:,1) =

     0     1    -1     1     0
     1     0     1     1     0
     1     0     1     0     1
     1     1     1     1     0
    -1    -1     1     1     1

mat_result(:,:,2) =

     1     1    -1     1     1
     0     1     1     0     1
     0     1     1     0     1
     1     0     1     1     1
    -1    -1     0     0     0


mat_result(:,:,3) =

     1     0    -1     1     1
     1     1     0     0     0
     1     1     1     1     0
     0     1     0     0     0
    -1    -1     0     0     1

首先,我找到位置

ind = find(mat(:,:,1)==0 & mat(:,:,2)==0 & mat(:,:,3)==0)

ind =

     5
    10
    11

简单来说,我就是这样做的

matt1 = mat(:,:,1);
matt2 = mat(:,:,2);
matt3 = mat(:,:,3);
matt1(ind) = -1;
matt2(ind) = -1;
matt3(ind) = -1;

mat_result = cat(3,matt1,matt2,matt3);

我的问题是

  1. 有没有更好的方法来选择/更改子矩阵的子矩阵? 例如(但它不起作用):

    mat(:,:,1)(mat(:,:,1)==0 & mat(:,:,2)==0 & mat(:,:,3)==0) = -1;

  2. 是否有更短的方法来更改所有 3 层中值为零的每一层中的值?

【问题讨论】:

    标签: matlab image-processing matrix


    【解决方案1】:
    mat(repmat(~any(mat,3),[1,1,3]))=-1
    

    您可以使用any 函数来代替mat(:,:,1)==0 & mat(:,:,2)==0 & mat(:,:,3)==0

    【讨论】:

    • 有没有办法从子矩阵中选择子矩阵? (在我的第一个问题中)
    • @BOSS 不知道第一个问题的代码应该做什么。请描述预期的输出。
    • 对于我的第一个问题,我想要的输出与 mat_result(:;:;1) 相同
    • 特别是,我想更改第一层的值,但我必须考虑所有 3 层。我按照上面的方法做了。(查找索引 -> matt1 = mat(:;:;1) -> matt1(ind) = -1)
    • 我认为可能有一种方法可以使用这个 =>> mat(:,:,1)(ind)。使用 1 行代码更改 submetrix 中的某些组件。
    【解决方案2】:

    使用 repmat 函数复制您使用得到的逻辑矩阵

    mat(:,:,1)==0 & mat(:,:,2)==0 & mat(:,:,3)==0.
    

    沿第三个通道复制它。最后声明是:

    mat(repmat(mat(:,:,1)==0 & mat(:,:,2)==0 & mat(:,:,3)==0,[1 1 3]))=-1
    

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多