Matlab:用最后一个非零索引替换零

时间:2021-01-31 19:22:59

标签: arrays matlab image-processing matrix

我有一个大小为 352x240 uint_8 的矩阵 Cr。 Output matrix

如何用最后一个非零索引替换零? 例如,输出应该是这样的:

141 141 141 142 ...
141 141 141 142 ...
141 141 141 142 ...
141 141 141 142 ...
149 148 150 150 ...
 .   .   .   .  ...
 .   .   .   .  ...

非常感谢任何帮助。谢谢

3 个答案:

答案 0 :(得分:7)

这适用于一般情况,当零和非零的出现不一定是周期性的或跨列一致时。它假定第一行不包含零(否则问题未定义):

result = Cr(cummax((Cr~=0).*(1:size(Cr,1)).', 1) + (0:size(Cr,1):numel(Cr)-1));

要了解它的工作原理,请参阅:

示例:

>> Cr = [141 141 141; 0 0 0; 0 0 145; 147 0 0; 149 148 0; 0 0 0]
Cr =
   141   141   141
     0     0     0
     0     0   145
   147     0     0
   149   148     0
     0     0     0

>> result = Cr(cummax((Cr~=0).*(1:size(Cr,1)).', 1) + (0:size(Cr,1):numel(Cr)-1))
result =
   141   141   141
   141   141   141
   141   141   145
   147   141   145
   149   148   145
   149   148   145

答案 1 :(得分:2)

如果我们像 C++ 中的矩阵数组那样思考,这应该可行:

matrix[n][m]=matrix[n-((n-1)%4)][m]

所有不为 0 的数字都在索引 (1,5,9,13...) 中。 所以它是 n=1(mod4)。简单的数学就可以解决这个问题。

答案 2 :(得分:2)

使用范围索引和repelem

result = repelem(Cr(1:4:end, :), 4, 1);

编辑
在一般情况下,可以使用此方法:

f = find(Cr);
result = reshape(repelem(Cr(f), diff([f;numel(Cr)+1])), size(Cr));