MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 686|回复: 10|关注: 0

[已答复] MATLAB如何用循环提取矩阵的第i-n项到第i+n项

[复制链接]

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
发表于 2017-6-14 22:10:23 | 显示全部楼层 |阅读模式
我写了一个中值滤波的程序,如下:
x=xlsread('2.xlsx','A1:A9574');
y=xlsread('2.xlsx','B1:B9574');
n=5;                         %滤波窗口大小
a=zeros(1,n);                %生成一个n个0元素的行向量
b=[a';y];
d=[b;a'];                    %拼接两个向量
%---------加噪声(随机噪声)--------%
e=randi([1 100],size(d));
c=d+e;
w=y+e(n+1:9574+n,1);
%-------------------------------%
i=n+1:9574+n;
K=[c(i-5),c(i-4),c(i-3),c(i-2),c(i-1),c(i),c(i+1),c(i+2),c(i+3),c(i+4),c(i+5)];    %取第i个元素和它的相邻的2n个元素
B=sort(K');                  %将所取的元素进行排序
A=B';
z=A(:,n+1);                  %取中间值
subplot(311)
plot(x,y)
subplot(312)
plot(x,w)
subplot(313)
plot(x,z)


其他地方可不用管,如何将K=[]写成一个循环。因为程序本次取n=5,所以从c(i-5)取到了c(i+5),如果n取别的值,就需要改变K[]中的元素,n可能会取更大的值,这样把所有的元素列出来会比较麻烦。因此,如何通过循环把K改成一个通用的写法。各位大神,求教。

新手

27 麦片

财富积分


050


0

主题

22

帖子

4

最佳答案
发表于 2017-6-14 22:28:47 | 显示全部楼层
可以直接用medfilt1函数取代你的循环,这应该是最简单的方法。

新手

26 麦片

财富积分


050


0

主题

33

帖子

5

最佳答案
发表于 2017-6-14 23:07:42 | 显示全部楼层
本帖最后由 bjlxwjs 于 2017-6-15 09:58 编辑

错了,我再看看

MATLAB 基础讨论
版块优秀回答者

入门

189 麦片

财富积分


50500


3

主题

299

帖子

41

最佳答案
  • 关注者: 2
发表于 2017-6-15 10:17:50 | 显示全部楼层
可以直接用
  1. k = c(i - n : i + n);
复制代码

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-15 16:10:44 | 显示全部楼层

用了这个后,最后K只输出了i=n+1时的结果,是出了什么问题啊?

新手

6 麦片

财富积分


050


7

主题

58

帖子

0

最佳答案
  • 关注者: 1
发表于 2017-6-15 17:08:41 | 显示全部楼层
4楼的没有问题啊。
>> a = rand(1,10)

a =

    0.6557    0.0357    0.8491    0.9340    0.6787    0.7577    0.7431    0.3922    0.6555    0.1712

>> i = 5;n = 3;
>> b = a(i - n : i + n)

b =

    0.0357    0.8491    0.9340    0.6787    0.7577    0.7431    0.3922

>>

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-16 14:21:00 | 显示全部楼层
busyyang 发表于 2017-6-15 17:08
4楼的没有问题啊。
>> a = rand(1,10)

按我原来的程序,最后得到的K是一个(2n+1)×9574的矩阵,而不是一个向量,上面这种方法还是有些问题。

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-16 16:20:08 | 显示全部楼层
已经解决了,用了一个循环
i=n+1:9574+n;
for j=1:2*n+1
    K(:,j)=d(i-n+j-1);
end
谢谢各位

新手

14 麦片

财富积分


050


13

主题

70

帖子

1

最佳答案
发表于 2017-6-17 16:08:28 | 显示全部楼层
lyjqweasdzxc 发表于 2017-6-16 14:21
按我原来的程序,最后得到的K是一个(2n+1)×9574的矩阵,而不是一个向量,上面这种方法还是有些问题。 ...

你用4楼的程序,另外再新建一个变量,存储每次的结果,最后就可以得到一个矩阵了。

新手

26 麦片

财富积分


050


0

主题

31

帖子

5

最佳答案
  • 关注者: 1
发表于 2017-6-17 20:19:42 | 显示全部楼层
K1=c(bsxfun(@plus,i',-5:5));
bsxfun函数也可以达到同样的功能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

快速回复 返回顶部 返回列表