MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 410|回复: 3|关注: 0

[已解决] polyfit不能处理二维矩阵,为什么

[复制链接]

新手

12 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
本帖最后由 逝云 于 2017-12-7 17:11 编辑

我的要求是根据8个点的位置(y)来预测后面一个点的位置,所以需要用到 POLYFIT(x,y,n)和POLYVAL(p,t).
那我的问题是,当我的x 和 y 都是 1行8列的数据时候没有问题,返回了一个1x4的系数(我用n=3)。
即, x=[x1-1 x1-2 x1-3 x1-4 x1-5 x1-6 x1-7 x1-8]
        y=[ y1-1 y1-2y1-3 y1-4 y1-5 y1-6 y1-7 y1-8]

polyfit (x,y,3) 会返回一组数据,没有问题

但是我有100行这样的数据,当我把 x 和 y 写成 100x8 的Array的时候,polyfit 仍然返回1组系数并没有返回一个100x4 的Array,但是我需要100行这样的系数放进POLYVAL 里面去预测100个点。
这样的话我该怎么做呢?

x=[ 0 1 2 3 4 5 6 7
      0 1 2 3 4 5 6 7
      ………  
                                              ---------100行

y=[ y1-1 y1-2 y1-3 y1-4 y1-5 y1-6 y1-7 y1-8
      y2-1 y2-2 y2-3 y2-4 y2-5 y2-6 y2-7y2-8
       …………


                                                ---------100行

我想知道polyfit是不是只能做 1行n列的计算,如果我有100组 8个点要做polyfit 是不是要做100次polyfit?就是说不能写成为(100x8的形式)

论坛优秀回答者

权威

6827 麦片

财富积分



5

主题

8172

帖子

1563

最佳答案
  • 关注者: 352
发表于 2017-12-7 19:18:20 | 显示全部楼层 |此回复为最佳答案
polyfit(x,y,3)相当于polyfit(x(:),y(:),3),所以不能一次性拟合所有行。可以这样
  1. cell2mat(arrayfun(@(k) polyfit(x(k,:),y(k,:),3),1:size(x,1),'un',0)')
复制代码

新手

12 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
 楼主| 发表于 2017-12-14 10:44:34 | 显示全部楼层
本帖最后由 逝云 于 2017-12-14 10:45 编辑
jingzhaos 发表于 2017-12-7 19:18
polyfit(x,y,3)相当于polyfit(x(,y(,3),所以不能一次性拟合所有行。可以这样

大神你好,我有点不太明白您的代码,我是MATLab初学者,我去查找了arrayfun的一些基础介绍信息,我放在了回帖的最后

看上去您的代码和后面的例3差不多,cell2mat(arrayfun(F,ss,'UniformOutput',false)),这里的F就是您的@(k) polyfit(x(k,:),y(k,:),3),意思是对x,y做3相式回归计算
1:size(x,1), 应该意思是 计算从第一行到最后一行
最后一个cell2mat是把数据变成数组形式(应该是和xy一样size的)

但是,我的问题是
这个 'un',0, 还有最后的‘(单引号)是什么意思?就是整个代码最后一个括号前面的’,这个是笔误多写了一个单引号吗?

---------------------------------------------------------------------
利用arrayfun函数可以避免无谓的循环,从而大大提高代码的简介性。
1、A=ARRAYFUN(FUN, B)
FUN是函数句柄,对B中的每一个元素调用FUN函数(计算顺序随意),结果存放于A中,size(A)==size(B)
FUN函数可接受numeric, logical, char, struct, cell的自变量类型。
2、[A, B, ...] = ARRAYFUN(FUN, C, ...)
FUN函数的返回值是一个向量,对B中的每一个元素调用FUN函数,计算结果放在A,B…中。
3、 A = ARRAYFUN(FUN, B, C,  ...)
FUN函数接受参数不唯一,分别调用B, C,  ...中的元素,A(i,j...)=Fun(B(i,j...),C(i,j,...)...),
B,C...大小必须相等。
例1、Fun调用B中的一个数值

>> s=[1 2;3 4];
>> f=@(x) x^2;
>> arrayfun(f,s)
ans =
     1     4
     9    16
复制代码
例2、Fun的接受参数是一个向量

>> ss=num2cell(s,2);
>> f=@(x) sum(x{:}.^2);
>> arrayfun(f,ss)
ans =
     5
    25
复制代码
例3、Fun函数返回值是向量

>> F=@(x) x{:}.^2;
>> cell2mat(arrayfun(F,ss,'UniformOutput',false))
ans =
     1     4
     9    16
复制代码

论坛优秀回答者

权威

6827 麦片

财富积分



5

主题

8172

帖子

1563

最佳答案
  • 关注者: 352
发表于 2017-12-14 11:27:41 | 显示全部楼层
本帖最后由 jingzhaos 于 2017-12-14 11:29 编辑
逝云 发表于 2017-12-14 10:44
大神你好,我有点不太明白您的代码,我是MATLab初学者,我去查找了arrayfun的一些基础介绍信息,我放在了 ...

你要的是系数矩阵,arrayfun相当于循环,但每次出来的系数都是cell,'UniformOutput',false 目的就是说要cell 型结果,'un'是缩写,false可用0表示。后面的'是转置,不转置结果不对,无法转成你要的矩阵。你可以试试去掉un 或'的结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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