更新:我已经做了一些测试,Jonas 的解决方案对于一系列不同大小的输入向量来说是最快的。特别是,正如 angainor 指出的那样,该解决方案可以非常好地扩展到大尺寸 - 这是一项重要的测试,因为通常是大尺寸问题促使我们在 SO 上提出此类问题。感谢 Jonas 和 tmpearce 的解决方案——基于解决大型问题的效率,我将答案打勾给 Jonas。
我的问题:我有这个列向量:
Vec = [0; 1; 2; -1; -3; 0; 0; 2; 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
它将仅包含整数值。提前感谢所有建议。