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