Cell类型报错提示

来源:互联网 发布:mkv剪辑软件 编辑:程序博客网 时间:2024/05/17 03:20
在写离散卷积函数时遇到一个问题,matlab报错:

大概意思就是cell型不能直接乘。问题是我在程序中并没有使用cell类型,为什么会报这个错?网上搜了一下,没找到解决办法,只能自己试着找错误了。代码如下:

function yn=conv_d(xn,hk)%计算序列xn和序列hk的长度 k = length(hk); n = length(xn);  %计算输出序列yn的长度 N = k+n-1 ; yn = zeros(1,N);  %在xn两端分别填充k_1个0,生成序列xn_fill xn_fill = {zeros(1,k-1),xn,zeros(1,k-1)}; %对序列hk进行翻转 hk_temp = hk ; for i=1:k hk(i) = hk_temp(k-i+1); end  %卷积过程(*表示数据,0为填充) %  000******000        ——>     000******000 %  ****           右移 ——>             ****    for i=1:N %序列右移的次数 sum = 0 ; for j=1:k   sum = hk(j)*xn_fill(j+i-1) + sum;   end   yn(i) = sum ; end



定位到这一句“sum = hk(j)*xn_fill(j+i-1) + sum;”可以肯定的是sum和hk不会是cell类型,那么最有可能的就是xn_fill变成了cell型。于是定位到这一句“xn_fill = {zeros(1,k-1),xn,zeros(1,k-1)};” 为了在xn两边填充若干个0,用了{}来做拼接。那么问题来了,拼接的过程中是否将xn_fill转成了cell型?测试发现,果然是这样:


于是在“xn_fill = {zeros(1,k-1),xn,zeros(1,k-1)};”后面再加一句“xn_fill = cell2mat(xn_fill);”这回没有报错,并成功得出卷积结果:

那么,来总结一下matlab中这几个符号的用法吧:

(以下内容转自http://blog.sina.com.cn/s/blog_56d5b3b001010ab4.html

 

[]中括号用来构建向量(Vectors)或者是矩阵(Matrices)。如[6.9 9.64sqrt(-1)]就是一个有三个元素的向量。[11 12 13; 21 22 23]是一个二乘三的矩阵。分号(;)用来结束一行。中括号的另一个作用是在函数中,分配输出参数。

 

{}大括号,用于cell型的数组的分配或引用。比如A(2,1) = {[1 2 3; 4 5 6]}, or A{2,2} = ('str')

 

()小括号,用于引用数组的元素。如 X(3)就是X的第三个元素。 X([12 3])就是X的头三个元素。

 

Expmple

A = [ 1 2 3 ]

%A就是一个三个元素的数值数组。中括号用于构建非cell数组。

%数组的引用用小括号

A(1,2)

%A(1,2)得到A数组第一行第二列的元素。

 

B = {A A}

%B1一行两列的数组,数组的元素为cell

%数组的引用依然用小括号

B(1)

%这时B(1)为一个cell,cell内容的引用需要用大括号。

%B{1}则为cell 1的内容,此时为 1 23,cell内容为数值数组的,继续用小括号引用其内容

B{1}(1,3)

%B{1}(1,3)的内容为3.

 

D={B B}

D ={1x2 cell} {1x2 cell}

此时D的某个元素内容的引用则为

D{1}{1,2}(1)

cell层都需要用大括号引用。