为什么我会出现vertcat错误?(Matlab)

为什么我会出现vertcat错误?(Matlab),matlab,matrix,Matlab,Matrix,我试图根据时间t绘制矩阵的第一行,但我无法找出矩阵产生错误的原因:vertcat: 被连接的矩阵的维数不一致 你用符号表示法思考,但用矩阵表示法实现。当您不这样做时,t=linspace0100;它创建一个1x100矩阵阵列。因此,当稍后在y_mat的定义中使用它时,定义中使用的每个表达式的计算结果为1x100矩阵。因此,您的y_mat定义与此相关:[1x100]*[1 1x100;1x100 1x100]*[1x100;1],这显然是失败的 您有两个选择: 在矩阵表示法中进行所有计算时,首先分

我试图根据时间t绘制矩阵的第一行,但我无法找出矩阵产生错误的原因:vertcat: 被连接的矩阵的维数不一致


你用符号表示法思考,但用矩阵表示法实现。当您不这样做时,t=linspace0100;它创建一个1x100矩阵阵列。因此,当稍后在y_mat的定义中使用它时,定义中使用的每个表达式的计算结果为1x100矩阵。因此,您的y_mat定义与此相关:[1x100]*[1 1x100;1x100 1x100]*[1x100;1],这显然是失败的

您有两个选择: 在矩阵表示法中进行所有计算时,首先分别计算矩阵乘法,并重新构造矩阵以表示实际乘法,以确保正确复制1

使用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矩阵作为答案。

您用符号表示法思考,但用矩阵表示法实现。当您不这样做时,t=linspace0100;它创建一个1x100矩阵阵列。因此,当稍后在y_mat的定义中使用它时,定义中使用的每个表达式的计算结果为1x100矩阵。因此,您的y_mat定义与此相关:[1x100]*[1 1x100;1x100 1x100]*[1x100;1],这显然是失败的

您有两个选择: 在矩阵表示法中进行所有计算时,首先分别计算矩阵乘法,并重新构造矩阵以表示实际乘法,以确保正确复制1

使用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矩阵作为答案。

您将代码弄乱了。键入此类函数时需要小心。为了简单起见,我使用了一个循环

t = linspace(0,100);

nt = length(t) ;
y_mat = zeros(2,nt) ;

for i = 1:nt
y_mat(:,i) = (1/t(i))*([1           t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
    (3/2)*(exp(-t(i))-exp(-3*t(i)))   1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)

你把你的代码弄乱了..你在键入这样的函数时需要小心。为了简单起见,我使用了一个循环

t = linspace(0,100);

nt = length(t) ;
y_mat = zeros(2,nt) ;

for i = 1:nt
y_mat(:,i) = (1/t(i))*([1           t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
    (3/2)*(exp(-t(i))-exp(-3*t(i)))   1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)

你也可以更明确地写出来。方程式如下:

[ 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使用隐式单例展开。这在MatlabR2016B和更新版本中工作。更老的版本也可以使用它。方程式如下:

[ 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使用隐式单例展开。这在MatlabR2016B和更新版本中工作。对于旧版本的MATLAB,请使用bsxfun