我很熟悉Matlab和堆栈溢出,所以如果我在指南之外做错了什么,请不要犹豫,指出它。谢谢!
我一直试图在两个函数之间进行卷积,而我一直很难尝试让它工作。
t=0:.01:10;
h=exp(-t);
x=zeros(size(t)); % When I used length(t), I would get an error that says in conv(), A and B must be vectors.
x(1)=2;
x(4)=5;
y=conv(h,x);
figure; subplot(3,1,1);plot(t,x); % The discrete function would not show (at x=1 and x=4)
subplot(3,1,2);plot(t,h);
subplot(3,1,3);plot(t,y(1:length(t))); %Nothing is plotted here when ran
我用代码评论了我的问题。我不明白length
和size
在这种情况下的区别以及它会如何产生影响。
对于第二条评论,x=1
的幅度应为2
。虽然x=4
的幅度应为5
。绘制时,它仅在指定的位置显示任何内容,但在x=0
处看起来混乱。我假设这是错综复杂的情节不会被显示的原因。
如果有助于理解我一直在思考的内容,则会给出原始问题陈述。
考虑一个输入信号x(t),它由t = 1和t = 4的两个delta函数组成,振幅分别为A1 = 5和A2 = 2,脉冲响应为指数脉冲的线性系统(h(t)= e ^ -t)。使用0.01的增量绘制x(t),h(t)和t的线性系统y(t)的输出,范围为0到10。使用MATLAB内置函数conv。
答案 0 :(得分:0)
关于size
与length
length
产生一个等于输入最大维度的标量。对于您的数组,size
为1 x N
,因此length
会产生N
。
size(t)
% 1 1001
length(t)
% 1001
如果您将标量(N
)传递给ones
,zeros
或类似函数,则会创建一个方阵,即{{ 1}}。这会导致您在使用N x N
时看到的错误,因为conv
不接受矩阵输入。
conv
将向量传递给size(ones(length(t)))
% 1001 1001
或ones
时,输出将大小,因为zeros
会返回一个向量(如上所示),输出大小相同(和向量),因此size
没有任何问题
conv
如果需要矢量,则需要明确指定行数和列数。此外,在我看来,将size(ones(size(t)))
% 1 1001
用于向量中的元素数量会更好,因为它比numel
length
关于卷积输出的第二个问题:
首先,您创建的冲动位于z = zeros(1, numel(t));
的第一个和第四个索引,而不是x
和t = 1
的位置。由于您使用t = 4
的间距创建t
,0.01
实际上对应t(1)
而t = 0
对应t(4)
您想要使用t = 0.03
的值来指定放置冲动的位置
t
请注意,由于浮点错误,您可能没有完全 x(t == 1) = 2;
x(t == 4) = 5;
和t == 1
,因此您可以使用小型epsilon
t == 4
完成此更改后,我们将获得输入函数的预期缩放和移位版本。