【问题标题】:Matlab element-wise power - can't understand how it worksMatlab element-wise power - 无法理解它是如何工作的
【发布时间】:2016-05-25 14:31:32
【问题描述】:

我有一个匹配滤波器,我想在 Matlab 中绘制它的频率响应。

过滤器响应为:H(f) =

我试图用以下方式绘制它:

%Freqency_Response_of_wiener_filter
f = linspace(-1e3,1e3,1e5);
H = ((2*pi*f)^2+10^6)/(11*(2*pi*f)^2+10^6+10^4);
plot(f,H);
xlabel('f')
ylabel('H(f)')

这不起作用,给我“矩阵尺寸必须一致”的错误。 然后我读到了“element-wise power”,它似乎完全符合我的需要,并将H 更改为:

H = ((2*pi*f).^2+10^6)/(11*(2*pi*f).^2+10^6+10^4);

这确实是在策划一些事情,只是不是我想要的 :) 我也试过了

H = ((2*pi)^2*f.^2+10^6)/(11*(2*pi)^2*f.^2+10^6+10^4);

没有运气。 我让它工作的唯一方法是:

%Freqency_Response_of_wiener_filter
f = linspace(-1e3,1e3,1e5);
for i=1:length(f)
  H(i) = ((2*pi*f(i))^2+10^6)/(11*(2*pi*f(i))^2+10^6+10^4);
end
plot(f,H);

为什么 'element-wise power' 对我不起作用?

不仅如此 - 常规操作与“元素操作”之间究竟有什么区别?因为,例如,在这里:An Introduction to Matlab,有这样的情节:

a = 0:.01:5;
b = cos(2*pi*a);
plot(a,b)

然后是这个:

x = 2:.1:4;
y = 1./x;
plot(x,y)
xlabel('x');
ylabel('y');

我无法分辨它们之间的任何区别。为什么第一个不需要“逐元素操作”,而第二个却有?

谢谢。

【问题讨论】:

  • 简单的经验法则:当您想要进行元素操作时:在每个 /*^ 之前插入一个点。这有点矫枉过正,即2.*pi 除了2*pi 之外没有做任何其他事情,因为两者都已经是标量,但至少它可以让您免于调试这些难以发现的错误。
  • 我赞同 Adriaan 的评论。您不需要将标量乘以矩阵,但如果您有两个矩阵 (x,y) 和标量 (k) 之间,您可能会遇到调试问题:x*kk*y 两者工作,但x*k*y 会导致错误。无需弄清楚将点/点放在哪里,只需将其放在两个位置:x.*k.*y.

标签: matlab plot elementwise-operations


【解决方案1】:

H = ((2*pi)^2*f.^2+10^6)/(11*(2*pi)^2*f.^2+10^6+10^4);不起作用的原因是因为你需要./

H = ((2*pi)^2*f.^2+10^6)./(11*(2*pi)^2*f.^2+10^6+10^4);

第一种情况:

a = 0:.01:5;
b = cos(2*pi*a);
plot(a,b)

您不需要逐元素运算,因为只有一种方法可以计算向量或矩阵的余弦值。

另一方面,在另一种情况下:

x = 2:.1:4;
y = x.^2;
plot(x,y)
xlabel('x');
ylabel('y');

您需要指定要进行逐元素运算,而不是将矩阵自身相乘(仅适用于方阵)。

在您发布的第二种情况下:

x = 2:.1:4;
y = 1./x;
plot(x,y)
xlabel('x');
ylabel('y');

您需要 . 以便 Matlab 理解 1 必须是长度为 numel(x) 的向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2022-09-30
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多