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));
>>
returns 结果
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
两种情况下 i 都是 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
在您对 impulse_function 的定义中,整个数组与零进行比较,return 值只是一个数字而不是向量。
您可以将 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;
请注意,这将 return y
作为类型逻辑数组,但这不应该影响以后的数值计算。
让我们考虑以下脉冲函数代码
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));
>>
returns 结果
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
两种情况下 i 都是 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
在您对 impulse_function 的定义中,整个数组与零进行比较,return 值只是一个数字而不是向量。
您可以将 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;
请注意,这将 return y
作为类型逻辑数组,但这不应该影响以后的数值计算。