簡體   English   中英

Matlab:用最后一個非零索引替換零

[英]Matlab: Replace zeros with last non-zero index

我有一個大小為 352x240 uint_8 的矩陣 Cr。 輸出矩陣

如何用最后一個非零索引替換零? 例如,output 應該是這樣的:

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

任何幫助深表感謝。 謝謝

當零和非零的出現不一定是周期性的或跨列一致時,這適用於一般情況 它假定第一行不包含零(否則問題未定義):

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

如果我們像 C++ 中的矩陣數組一樣思考,這應該可以工作:

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

所有非 0 的數字都在索引 (1,5,9,13...) 中。 所以它是n = 1(mod4)。 簡單的數學可以解決這個問題。

使用范圍索引和repelem

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

編輯
在一般情況下,可以使用此方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM