假設我有一個輸入行向量,由 0 和數字補丁組成,沒有任何關于其范圍的指示:
A = [0 0 1 1 1 1 0 0 0 0 22 22 22 0 0 6 6 6 6 6 0 1 1];
我想創建一個2 x m矩陣,其中m是補丁的數量,其中第一行列j跟蹤jth補丁中的值,第二行列j跟蹤jth補丁的平均索引(比如索引如果不是整數,將是平均值左側的第一個整數)。
與我的示例相關的輸出應該是:
out =
1 22 6 1
4 12 18 22
我正在嘗試解決它find,它可能最終會起作用,但它很難看,而且可能會很慢,而且我很確定你們中的一個人有一個很酷的技巧!
我得到了一些作業(見下面的代碼),但如果補丁不是不同的(即如果A包含沒有與至少一個分隔的補丁)它將不起作用0:
d1 = diff([0 A]);
idx_S = find(d1>0);
idx_E = find(d1<0)-1;
if length(idx_E)<length(idx_S)
idx_E = [idx_E length(A)];
end
idx_M = floor(mean([idx_E;idx_S],1));
out = [A(idx_M);idx_M];
例如,對于:
A = [0 0 1 1 1 1 0 0 0 0 22 22 22 0 0 6 6 6 6 6 1 1];
它會輸出
out =
1 22 6
4 12 18
代替
out =
1 22 6 1
4 12 18 21
uj5u.com熱心網友回復:
根據燒杯的評論,一些關于運行長度編碼的快速搜索將我帶到那里,這適用于我的問題給出:
A = [0 0 1 1 1 1 0 0 0 0 22 22 22 0 0 6 6 6 6 6 1 1];
idx_E = [find(A(1:end-1) ~= A(2:end)) length(A)]; % end of patches, keeping patches of zeros
idx_S = [1 idx_E(1:(end-1)) 1]; % start of patches, idem
idx_M = floor(mean([idx_E;idx_S],1)); % mean index, idem
out = [A(idx_M);idx_M];
out(:,A(idx_M)==0) = []; % removing patches of zeros
% out =
% 1 22 6 1
% 4 12 18 21
uj5u.com熱心網友回復:
一種解決方案:
% Your input:
A = [0 0 1 1 1 1 0 0 0 0 22 22 22 0 0 6 6 6 6 6 0 1 1];
% Detect the variation
ind = find(diff([0,A,0]>0));
% Construct the output array
res = [A(ind(1:2:end-1)); floor(mean(reshape(ind,2,[]))-0.5)]
我們得到了
% res =
% 1 22 6 1
% 4 12 18 22
請注意,如果兩個補丁沒有被至少一個 0 分開,則此方法將失敗。
uj5u.com熱心網友回復:
這個解決方案似乎有點密集,但確實實作了你想要的,對于數字的“補丁”,無論它們是否被零分割。
A = [0 0 1 1 1 1 0 0 0 0 22 22 22 0 0 6 6 6 6 6 1 1];
m = arrayfun( @(x) x-1 floor(find([A(x:end),NaN]~=A(x),1)/2), find([1,diff(A)].*A) );
m = [A(m); m];
% m =
% 1 22 6 1
% 4 12 18 21
要打破這一點:
[0,diff(A)]查找元素之間的點對點增量(補丁在非零時開始/結束)。find([0,diff(A)].*A)A從與非零元素的索引大小相同的陣列轉換(通過乘以過濾A,當 洗掉A=0)。arrayfun( ___, find([0,diff(A)].*A) )回圈這些指標@(x) x-1 floor(find([A(x:end),NaN]~=A(x),1)/2)對于索引陣列的每個元素x,回傳補丁的“中間”,它被定義為與x不等于的下一個元素之間的范圍A(x)。
然后 finallym被定義為這些指標與這些指標的值相連接A。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/493244.html
標籤:matlab
上一篇:在MATLAB中繪制透明線
