[英]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.