Matlab 使用另一个向量的值在另一个向量的位置填充向量的所有值

Matlab 使用另一个向量的值在另一个向量的位置填充向量的所有值,matlab,Matlab,我有两个向量表示一些连续数据的边和水平(这是目前模拟的) 如何创建一个向量,前50个条目有24个,后120个条目有3个,等等 我试过了 psd = zeros(1,250) psd(edges) = levels 但这只是在相关位置放置了一个值-这不是我想要的。涉及一个循环,但应该可以。此外,您的边和级别的长度必须相等 v = []; for i = 1:numel(edges) v = [v;level(i)*ones(edges(i),1)]; end 这里有一个更有效的版本,它

我有两个向量表示一些连续数据的边和水平(这是目前模拟的)

如何创建一个向量,前50个条目有24个,后120个条目有3个,等等

我试过了

psd = zeros(1,250)
psd(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中,循环并不总是邪恶的。有时候,这是最简单(也是最清晰)的解决方案。

您的描述和代码不太匹配。您希望psd包含250个元素还是1234个元素(
sum(edges)
,正如您使用后续命令所暗示的那样)?如果是后者,您只需修改
边=cumsum(边)
。其次,对于给定的边,没有足够的级别

这里有一个不使用循环的解决方案

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)

这里有一个小解决方案,如果
确实是间隔的边:

以0作为第一个元素展开向量
级别

levels = [0, 24, 3, 30, 0, 36, 0];
然后您可以执行以下操作:

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

在间隔限制处放置两个连续值之间的偏移量,其他位置为0。总结时,您得到了您所期望的。

您可以使用此运行长度解码实用程序,它实现了以下方法:

结果

rude(edges, levels)
ans =
    24    24     3     3     3    30
受此启发,您可以使用:

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);

级别
的大小不同。你不是忘了什么地方有一个
0
?你的问题也不是很清楚:psd的长度是多少?考虑到你的尝试,它将是250;但是你提到了后面120的3,所以我知道
psd
的长度应该是50+120+…+250。你能准确地说出你在想什么可能性吗?@Eitan T:你能准确地说出你的想法吗?前50个值我有24个,然后3个直到索引120,等等。正确的值是什么意思?我的错误,复制粘贴错误。无pb,欢迎评论和更正:)
rude(edges, levels)
ans =
    24    24     3     3     3    30
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);