gpt4 book ai didi

Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:59 25 4
gpt4 key购买 nike

更新:我做了一些测试,Jonas 的解决方案对于一系列不同大小的输入向量来说是最快的。特别是,正如 angainor 指出的那样,该解决方案可以很好地扩展到大尺寸——这是一项重要的测试,因为通常是大尺寸问题促使我们在 SO 上提出这类问题。感谢 Jonas 和 tmpearce 提供的解决方案 - 基于大型问题解决方案的效率,我将答案打勾给 Jonas。

我的问题:我有这个列向量:

Vec = [0; 1; 2; -1; -3; 0; 0; 2; 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

关于Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13097042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com