2013-08-19 61 views
0

我有兩個向量表示一些連續數據的邊緣和級別(此處模擬此)。使用另一個向量的值填充矢量的所有值從另一個向量的位置

edges = [50, 120, 170, 200, 220, 224, 250] 
levels = [24,3,30,0,36,0] 

我該如何創建一個向量,前24個條目有24個,後續120個有3個?

我已經試過

psd = zeros(1,250) 
psd(edges) = levels 

但這只是把在相關位置上的單值 - 這是不太我想要的。

+2

'edges'和'levels'的大小不一樣。你不是在某個地方忘了'0'嗎?另外你的問題不是很清楚:'psd'的長度是多少?考慮到你的嘗試,它將是250;但是你爲後面的120_提到了_3,所以我明白'psd'的長度應該是50 + 120 + ... + 250。你能否確定你想要的是哪種可能性? – Bentoy13

回答

1

您的描述和代碼不完全匹配。你想psd有250個元素或1234(sum(edges),因爲你使用後續會暗示)?如果是後者,則可以簡單修改edges = cumsum(edges)。其次,你沒有足夠的水平給定的邊緣。

這是一個不使用循環的解決方案。

edges = [50, 120, 170, 200, 220, 224, 250]; 
levels = [24,3,30,0,36,0,nan]; % padded with nan for equal length 
idxs = length(levels) - sum(bsxfun(@(x,y) x < y,1:max(edges),edges'+1))+1; 
pds = levels(idxs) 

或者更簡單:

idxs = zeros(1,max(edges)); 
idxs(edges(1:end-1)+1) = 1; 
psd = levels(cumsum(idxs)+1) 
0

涉及一個循環,但它應該是確定的。此外,您的edgeslevels需要具有相同的長度。

v = []; 
for i = 1:numel(edges) 
    v = [v;level(i)*ones(edges(i),1)]; 
end 

這是一個更高效的版本,它負責分配開銷。

v = zeros(sum(edges),1); 
c = [0 cumsum(edges)]; 
for i = 1:numel(edges)-1 
    v(c(i)+1:c(i+1)) = levels(i)*ones(edges(i),1); 
end 

只記得;循環在今天的MATLAB中並不總是邪惡的。有時候,這是最簡單(也是最清晰)的解決方案。

1

這裏是一個小的解決方案,如果edges是您的間隔真正的邊緣:

展開載體levels以0作爲第一元素:

levels = [0, 24, 3, 30, 0, 36, 0]; 

然後您可以執行以下操作:

psd = zeros(1,250); 
psd(edges(2:end)-1) = diff(levels); 
psd = cumsum(psd); 

您將間隔限制爲兩個連續值之間的偏移量,其他位置爲0。總結時,你有你所期望的。

+0

@Eitan T:你能不能確定你的想法?對於50個第一個值,我有24個,然後是3個,直到索引120等。對於正確的值,你是什麼意思? – Bentoy13

+0

我的錯誤,複製粘貼錯誤。 –

+0

沒有pb,意見和更正始終歡迎:) – Bentoy13

0

您可以使用此行程編碼工具FEX rude(),它實現了方法表明由Bentoy13

% example inputs 
edges = [2, 3, 1]; 
levels = [24,3,30]; 

結果

rude(edges, levels) 
ans = 
    24 24  3  3  3 30 
0

靈感來自an answer通過gnovice您可以使用此:

psd = levels(cumsum(sparse(1,cumsum([1 edges(1:end-1)]),1,1,sum(edges)))); 

爲了使它更容易創建一個匿名函數,並重新使用它:

populate = @(L,E) L(cumsum(sparse(1,cumsum([1 E(1:end-1)]),1,1,sum(E)))); 
psd = popultae(levels, edges); 
相關問題