Matlab中變數的動態定義

2021-08-07 13:18:25 字數 2300 閱讀 9305

在學習《機械人學》的時候,常常遇到轉換矩陣 ba

t 這樣的表示,意思是座標系

轉換到座標系

的轉換矩陣,在程式設計的時候我通常都會寫作tab,如果給定了多個關節的dh參數列,有時候需要同時計算多個轉換矩陣,為了利用for迴圈來簡化**,可以利用元胞陣列(cell)進行輸出

dh   = [...];           %dh參數列設定

link = size(dh,1); %取dh表的列數,即所需求解的轉換矩陣個數

for k=1:link

t = transmata(dh(k,:)'); %transmata是乙個自定義的轉換矩陣求解函式

endt10 = t;

t21 = t;

t32 = t;

t43 = t;

t54 = t;

t65 = t;

但是更多的情況下,我們更希望下面的賦值也能夠自動進行,即我們希望變數名也能動態變化,那麼就需要用到eval命令,該命令的作用是「執行文字字串中的 matlab 表示式」,即事先將命令儲存到字串型別的變數中,再利用該函式執行,常用於不同型別資料的變數迴圈賦值,這與元胞陣列的設計初衷類似,但是定製的空間更大(元胞陣列的話只能定義數值型的行列座標,而用eval命令可以定製任意的下標)

for k=1:link

t_temp = transmata(dh(k,:)');

str = (['

t',num2str(k-1),num2str(k),'= t_temp',';']);

eval(str)

end

附上transmat函式和transmata函式

function

t = transmata

(x)%% 請注意連環相乘矩陣的順序(序數大的在後面) ${}^0_nt = {}^0_1t{}^1_2t\cdots{}^_t{}^_nt$

%這個函式是根據dh表求解轉換矩陣

%變數x=[alpha_i-1;a_i-1;d_i;theta_i]

z = zeros(3,1);

a1 = [x(1);0;0];

t1 = transmat(a1,z);

p2 = [x(2);0;0];

t2 = transmat(z,p2);

a3 = [0;0;x(4)];

t3 = transmat(a3,z);

p4 = [0;0;x(3)];

t4 = transmat(z,p4);

t = t1 * t2 * t3 * t4;

end

function

t= transmat

(x,p,flag)

% t = transmat(x,p,flag) 角度位移求解轉換矩陣

% x=[alpha;beta;gamma] xyz順序旋轉角度,當flag=0(預設)時以尤拉角求解,當flag=1時以固定軸角求解

% p=[x;y;z] 兩座標軸之間的平移量

% flag 如前所述

% transmat(x,p) 以尤拉角求解轉移矩陣(transmat(x,p,0)也行)

% transmat(x,p,1) 以固定軸角度求解轉移矩陣

% hu 2017-8-17

if (nargin < 3)

flag = 0;

endrotx = [100

0 cos(x(1)) -sin(x(1))

0 sin(x(1)) cos(x(1))];

roty = [cos(x(2)) 0 sin(x(2))

010-sin(x(2)) 0 cos(x(2))];

rotz = [cos(x(3)) -sin(x(3)) 0

sin(x(3)) cos(x(3)) 000

1];switch flag

case

1%fixed angle

r = rotz * roty * rotx;

case

0%euler angle(default)

r = rotx * roty * rotz;

endt = [r p;

0001];end

Matlab 中類的定義

2.2 properties 塊 2.3 methods 塊 2.4 events 塊 2.5 enumeration 類 在 matlab 中定義乙個名為 classname 類,需要在類名之前用classdef關鍵字來宣告,並以end結束類的定義。classdef語句之前除了空行和注釋不能有其它...

matlab中動態變數命名及賦值高階

在了解到eval 函式所實現功能的基礎上,可以把動態變數命名的問題轉換為如何通過迴圈構造合適的字串,再把字串作為eval 的輸入執行即可。程式示例如下 clear clc for set1 1 10for jklove 1 10for kapa 1 50fun hice phiinkecejjj s...

Matlab中的類定義 classdef

matlab也可以寫物件導向的 首先表現在可以定義類,以及可以繼承,使用類 class 有很多好處,其中乙個重要的好處便是解決變數名衝突和讓函式 物件的結構清晰。class的static function可以在不定義類的例項直接呼叫類的成員函式,比如定義 classdef tools handle ...