我有一个大小为 352x240 uint_8 的矩阵 Cr。
如何用最后一个非零索引替换零? 例如,输出应该是这样的:
141 141 141 142 ...
141 141 141 142 ...
141 141 141 142 ...
141 141 141 142 ...
149 148 150 150 ...
. . . . ...
. . . . ...
非常感谢任何帮助。谢谢
答案 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));