更新:我已经做了一些测试,Jonas的解决方案对于一系列不同大小的输入向量来说是最快的特别是,正如angainor所指出的,解决方案可以扩展到非常大的规模,这是一个非常重要的测试,因为通常是大规模的问题促使我们提出这样的问题感谢Jonas和tmpearce为您提供的解决方案-基于解决大型问题的效率,我将给Jonas一个答案。
我的问题:我有这个列向量:

Vec = [0; 1; 2; -1; -3; 0; 0; 2; 1; -1];

我想将大于1的每个元素转换为长度等于元素值的一个序列类似地,我想把每个小于负1的元素转换成负1的序列因此,我的输出向量应该如下所示:
VecLong = [0; 1; 1; 1; -1; -1; -1; -1; 0; 0; 1; 1; 1; -1];

请注意,每个2都已更改为两个1,而-3已更改为三个-1。目前,我解决的问题如下:
VecTemp = Vec;
VecTemp(VecTemp == 0) = 1;
VecLong = NaN(sum(abs(VecTemp)), 1);
c = 1;
for n = 1:length(Vec)
    if abs(Vec(n)) <= 1
        VecLong(c) = Vec(n);
        c = c + 1;
    else
        VecLong(c:c + abs(Vec(n))) = sign(Vec(n));
        c = c + abs(Vec(n));
    end
end

这感觉不太优雅有人能推荐一个更好的方法吗注意:您可以假设Vec只包含整数值提前谢谢你的建议。

最佳答案

您可以使用良好的旧cumsum方法正确地重复条目注意,如果您想将所有内容放在一行中,我将为您分配一些可以去掉的临时变量。

%# create a list of values to repeat
signVec = sign(Vec);

%# create a list of corresponding indices that repeat
%# as often as the value in signVec has to be repeated

tmp = max(abs(Vec),1); %# max: zeros have to be repeated once
index = zeros(sum(tmp),1);
index([1;cumsum(tmp(1:end-1))+1])=1; %# assign ones a pivots for cumsum
index = cumsum(index); %# create repeating indices

%# repeat
out = signVec(index);
out'
out =

     0     1     1     1    -1    -1    -1    -1     0     0     1     1     1    -1

09-09 23:26
查看更多