我想使用下面的数据得到三个连续数字的最大值,从这个例子中的前三个数字开始50.0,50.0和42.8然后将它存储在另一个Nx1矩阵中,然后选择接下来的三个数字,50.0 ,42.8和48.2,得到最大值并将其存储在Nx1矩阵的第二行,然后选择接下来的三个数字42.8,48.2和46.4得到最大值并将其存储在Nx1矩阵的第三行中,依此类推最后的数据(57.2)。我会感谢这方面的任何帮助。
50.0
50.0
42.8
48.2
46.4
46.4
55.4
71.6
71.6
69.8
51.8
57.2
答案 0 :(得分:1)
编辑:
clc
array = [50.0 50.0 42.8 48.2 46.4 46.4 55.4 71.6 71.6 69.8 51.8 57.2];
res = [];
len = length(array);
for i = 1 : len-2
m = max([array(i) array(i+1) array(i+2)]);
res = [res m];
end
m = max([array(len) array(len-1)]);
res = [res m m]
结果应该在res
变量
答案 1 :(得分:1)
将具有NaN(不是数字)的行作为占位符进行堆叠,然后在列之间取最大值:
a = [50.0 50.0 42.8 48.2 46.4 46.4 55.4 71.6 71.6 69.8 51.8 57.2];
A = a
A(end+1,:) = [a(2:end),NaN]
A(end+1,:) = [a(3:end),NaN,NaN]
max(A)
答案 2 :(得分:1)
编辑:与在R2016a中一样,有一个名为movmax的函数可以完成您想要实现的功能:
a = [50.0 50.0 42.8 48.2 46.4 46.4 55.4 71.6 71.6 69.8 51.8 57.2];
movmax(a,[0 2]) %
参数是:0
数字位于进行计算的关键元素的左侧,而2
位于右侧(+关键元素,意味着3元素向量打开,最大值为计算)
ans = 50.0000 50.0000 48.2000 48.2000 55.4000 71.6000 71.6000 71.6000 71.6000 69.8000 57.2000 57.2000
这可能是arrayfun
res = arrayfun(@(x) max(a(x:min(x+2,length(a)))), 1:length(a))
,其中
a = [50.0 50.0 42.8 48.2 46.4 46.4 55.4 71.6 71.6 69.8 51.8 57.2];
这里使用 arrayfun
在单个matlab命令中执行一些循环。获得预期结果的技巧是在输入向量的长度和内部索引之间取最小值,以使索引不超过向量的长度。
结果:
res = 50.0000 50.0000 48.2000 48.2000 55.4000 71.6000 71.6000 71.6000 71.6000 69.8000 57.2000 57.2000
答案 3 :(得分:1)
如果您有图像处理工具箱,则使用im2col
生成数据的重叠块作为矩阵的列,然后沿第一维应用max
:
x = [50.0 50.0 42.8 48.2 46.4 46.4 55.4 71.6 71.6 69.8 51.8 57.2].'; %'// data
N = 3; %// block size
xi = im2col([x(:); NaN(N-1,1)], [N 1]); %// append N-1 NaNs to generate the last blocks
result = max(xi, [], 1).';
在示例中,这给出了
result =
50.0000
50.0000
48.2000
48.2000
55.4000
71.6000
71.6000
71.6000
71.6000
69.8000
57.2000
57.2000