如何替换位于特定范围内的数据列中的值?

时间:2012-02-11 12:23:27

标签: matlab

我有一列数据,对于不同的愤怒,我想用一定的值替换此列的值。例如,对于6到15之间的所有值,我想用10替换。对于16到25之间的所有值,我想用20等替换。最简单的方法是什么? 感谢

4 个答案:

答案 0 :(得分:1)

逻辑索引:

y=rand(1, 50)
y(y>0.5) = 1
y

以上将y大于0.5的元素替换为1

您也可以使用find,但逻辑索引是显而易见的方法。

答案 1 :(得分:1)

如果在你的例子中都是如此,你可以使用它:

y=randint(100,1,1309)+1; % generate data sample

y=10*floor((y+4)/10) % 'round' to 10

答案 2 :(得分:0)

看起来你想要进行一些分箱,并用该范围的“中值”值替换某个范围内的值?以下是要遵循的基本原则的代码。使用HISTC。您可能需要在下面更改的唯一内容是“边缘”,否则,这应该可以解决问题:

x = round(rand(1,1000)*1400); % Sample data

intervalSize = 10; % 5 to 15, 15 to 25 etc.

maxEdge = max(x) + intervalSize - mod(max(x), intervalSize);
edges = 0:intervalSize:max(x);
[n bin] = histc(x,edges); % Don't really need 'n'

for i = 1: (numel(edges) - 1)
    midValue = mean([edges(i) edges(i+1)]);
    x(bin == i) = midValue;
end

这是另一种不使用HISTC的方法,但纯粹依赖于逻辑索引。

%% Approach 2:
x = round(rand(1,1000)*1400); % Sample data
intervalSize = 10;
maxEdge = max(x) + intervalSize - mod(max(x), intervalSize);
edges = 0:intervalSize:max(x);

for i = 1: (numel(edges) - 1)
    midValue = mean([edges(i) edges(i+1)]);
    x(x >= edges(i) & x < edges(i+1)) = midValue;
end

您可能需要调整逻辑索引条件以获得您想要的内容,但您明白了。

答案 3 :(得分:0)

我认为这是最简单的方法。

a = rand(1308, 1)*1308; % replace with your column

target = [10 20]; % replace with your targets and ranges
left = [6 15];
right = [16 25];

for i=1:length(target)
    a(a>=left(i)&a<right(i)) = target(i);
end