我有兩個向量表示一些連續數據的邊緣和級別(此處模擬此)。使用另一個向量的值填充矢量的所有值從另一個向量的位置
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
但這只是把在相關位置上的單值 - 這是不太我想要的。
我有兩個向量表示一些連續數據的邊緣和級別(此處模擬此)。使用另一個向量的值填充矢量的所有值從另一個向量的位置
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
但這只是把在相關位置上的單值 - 這是不太我想要的。
您的描述和代碼不完全匹配。你想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)
涉及一個循環,但它應該是確定的。此外,您的edges
和levels
需要具有相同的長度。
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中並不總是邪惡的。有時候,這是最簡單(也是最清晰)的解決方案。
這裏是一個小的解決方案,如果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。總結時,你有你所期望的。
您可以使用此行程編碼工具FEX rude()
,它實現了方法表明由Bentoy13:
% example inputs
edges = [2, 3, 1];
levels = [24,3,30];
結果
rude(edges, levels)
ans =
24 24 3 3 3 30
'edges'和'levels'的大小不一樣。你不是在某個地方忘了'0'嗎?另外你的問題不是很清楚:'psd'的長度是多少?考慮到你的嘗試,它將是250;但是你爲後面的120_提到了_3,所以我明白'psd'的長度應該是50 + 120 + ... + 250。你能否確定你想要的是哪種可能性? – Bentoy13