我正在尝试使用MATLAB 3 + 4.44e-16
函数来整合表示时变值的分段线性函数的单个参数。
我想基于原始函数定义一个匿名函数:
integral()
这是accel_profile.m:
t1 = 1;
t2 = 2;
t3 = 4;
t4 = 5;
a0 = 1;
a1 = 2;
f = @(x) accel_profile(t1,t2,t3,t4,a0,a1,x);
问题在于,当我运用以下脚本时:
function value = accel_profile(t1,t2,t3,t4,a0,a1, t)
if t <= t1
value = a0;
return
elseif (t <= t2)
value = ((t-t1)/(t2-t1)) * (a1-a0) + a0;
return
elseif (t <= t3)
value = a1;
return
elseif (t <= t4)
value = ((t-t3)/(t4-t3)) * (a0-a1) + a1;
return
else
value = a0;
return
end
我得到以下堆栈跟踪:
t_list = 0:0.1:6;
q = zeros(1,length(t_list))
for i = 1:length(t_list)
q(i) = integral(f,0,t_list(i));
end
plot(t_list, q)
我在Windows 7上运行MATLAB 2015b。
答案 0 :(得分:5)
问题是f
为你的函数使用了矢量化参数,但你的函数不支持它。
文件中的相关部分:
对于标量值问题,函数y = fun(x)必须接受向量参数x,并返回向量结果y。这通常意味着fun必须使用数组运算符而不是矩阵运算符。例如,使用。*(次)而不是*(mtimes)。如果你设置了'ArrayValued&#39;选项为true,那么fun必须接受一个标量并返回一个固定大小的数组。
这意味着,积分会使用f([1,2,3])
之类的参数调用您的函数[f(1),f(2),f(3)]
,并期望列表中包含@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q35002863.txt"
FOR /f "usebackqtokens=1-7*delims=^|" %%a IN ("%filename1%") DO (
SET "C8=%%h"
ECHO(%%a,%%b,%%c,%%d,%%e,%%f,"%%g",!C8:^|=,!
)
GOTO :EOF
一般技巧to vectorize a piecewise defined function are explained in this question