簡體   English   中英

為什么會出現vertcat錯誤? (Matlab)

[英]Why am I getting a vertcat error? (Matlab)

我試圖相對於時間t繪制矩陣的第一行,但是我無法弄清楚為什么矩陣會產生錯誤:“ vertcat:被連接的矩陣的尺寸不一致。” 在此處輸入圖片說明

t = linspace(0,100);

y_mat = (1./t).*([1, t+(1/2)*exp(-3*t)-(1/2)*exp(-t); 
(3/2)*(exp(-t)-exp(-3*t)), 1-(3/2)*exp(-3*t)+ 
(1/2)*exp(-t)] * [(t-4)/3;1]);

plot(t,y_mat(1,:))

您在用符號表示法思考,但是在矩陣表示法中實現。 當你做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矩陣,作為回答。

您弄糟了您的代碼..鍵入此類函數時需要小心。 為簡單起見,我使用了一個循環。

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使用隱式單例擴展。這在MATLAB R2016b和更高版本中適用。對於舊版本的MATLAB,請使用bsxfun 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM