簡體   English   中英

matlab中循環和向量化的比較

[英]comparison of loop and vectorization in matlab

讓我們考慮以下脈沖函數的代碼

function y=impulse_function(n);
y=0;
if n==0
    y=1;
end
end

這段代碼

>> n=-2:2;
>> i=1:length(n);
>> f(i)=impulse_function(n(i));
>> 

返回結果

 f

f =

     0     0     0     0     0

而這段代碼

>> n=-2:2;
>> for i=1:length(n);
f(i)=impulse_function(n(i));
end
>> f

f =

     0     0     1     0     0

在這兩種情況下,我都是 1 2 3 4 5,有什么不同?

在第一種情況下,您將數組與值 0 進行比較。這將給出結果 [0 0 1 0 0],這不是簡單的真或假。 所以語句y = 0; 不會被執行,f 將是 [0 0 0 0 0],如圖所示。

在第二個中,您將按值迭代數組值並將其傳遞給函數。 由於數組包含值 0,那么您將從 f 的打印輸出中的函數返回 1(或 [0 0 1 0 0],這是一個脈沖)。

您需要修改函數以接受數組輸入。

也許這個例子會進一步澄清這個問題:

cond = 0;
if cond == 0
    disp(cond) % This will print 0 since 0 == 0
end

cond = 1;
if cond == 0
    disp(cond) % This won't print since since 1 ~= 0 (not equal)
end

cond = [-2 -1 0 1 2];
if cond == 0
    disp(cond) % This won't print since since [-2 -1 0 1 2] ~= 0 (not equal)
end

您的函數未定義為處理向量輸入。

修改你的 impluse 函數如下:

function y=impulse_function(n)
    [a b]=size(n);
    y=zeros(a,b);
    y(n==0)=1;
end

在您對pulse_function 的定義中,整個數組與零進行比較,返回值只是一個數字而不是向量。

你可以簡單地定義你的impulse function作為這個 -

impulse_function = @(n) (1:numel(n)).*n==0

樣品運行 -

>> n = -6:4
n =
    -6    -5    -4    -3    -2    -1     0     1     2     3     4
>> out = impulse_function(n)
out =
     0     0     0     0     0     0     1     0     0     0     0

劇情代碼——

plot(n,out,'o')    %// data points
hold on
line([0 0],[1 0])  %// impulse point

繪圖結果 -

在此處輸入圖片說明

你可以寫一個更簡單的函數:

function y=impulse_function(n);
y = n==0;

請注意,這將y作為類型邏輯數組返回,但這不應影響以后的數值計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM