[英]Why am I getting a vertcat error? (Matlab)
您在用符号表示法思考,但是在矩阵表示法中实现。 当你做t = linspace(0,100);
它创建一个1x100
矩阵(数组)。 因此,稍后在y_mat
的定义中使用它时,定义中使用的每个表达式的计算结果为1x100
矩阵。 因此,您的y_mat
定义就是这样做的: [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
[1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
[1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
显然失败了。
您有两个选择:以矩阵表示法进行所有计算,方法是首先分别计算矩阵乘法,然后重组矩阵以表示实际乘法(确保正确地复制了1
s)。
要么
使用Matlabs的符号变量和表达式可能像这样:
syms t % creating symbolic variable
% creating symbolic expressions
f0 = 1/t
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]
% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error
% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));
这给y_mat_vals
一个2x100
矩阵,作为回答。
您也可以更明确地将其写出。 等式如下:
[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]
由于这些项都是标量,因此您可以使用逐元素乘法同时计算所有t
的项:
t = linspace(0,100);
pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
pt5 = (t-4)/3;
y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];
plot(t,y_mat)
这可能有些冗长,但我认为它的可读性并不比其他解决方案低。 而且效率更高:对于500个元素的t
,效率为0.0571毫秒,而483.3毫秒( 符号解 )和0.681毫秒( 循环解) 。
(请注意,乘以1./t
使用隐式单例扩展。这在MATLAB R2016b和更高版本中适用。对于旧版本的MATLAB,请使用bsxfun
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.