2017-10-21 5 views
0

私が持っている3マトリックス:Scilabのシンボリック行列の乗算

mulf(T_01,T_12,T_23) 

しかし、私はこのエラーを取得:

     !--error 39 
mulf: Quantidade incorreta de argumentos de entrada: esperava-se 2. 
を私は象徴的乗算を行う必要があるので、私がしようとしている

T_01 = ['cosd*t1', '-sind*t1', '0', 'd1*cosd*t1'; 'sind*t1', 'cosd*t1', '0', 'd1*sind*t1'; '0', '1', '1', '0'; '0', '0', '0', '1'] 

T_12 = ['cosd*t2', '-sind*t2', '0', 'd2*cosd*t2'; 'sind*t2', 'cosd*t2', '0', 'd2*sind*t2'; '0', '1', '1', '0'; '0', '0', '0', '1'] 

T_23 = ['cosd*t3', '-sind*t3', '0', 'd3*cosd*t3'; 'sind*t3', 'cosd*t3', '0', 'd3*sind*t3'; '0', '1', '1', '0'; '0', '0', '0', '1'] 

何が起こっていますか?

Obs .:私の英語を残念に思っています。

+0

'' mulf''関数は2つの引数しかとりません。乗算は連想的であるため、a * b * c = a *(b * c)とすると、 '' mulf(T_01、mulf(T_12、T_23)) ''を試すことができます。行列はこの関数の入力ではないので、もう一度別のエラーが発生します。あなたは正確に何をしたいですか?明確にすることはできますか?たぶん、あなたが期待した結果が何であるか教えてください。 – luispauloml

答えて

0

2つの行列の象徴的な乗算を得ることが必要な場合は、そのような関数を実装する必要があります。ここでは、あなたが望むものを一緒に実行できる3つの機能を実装しました:

function s = scaProd(a,b) 
    //escalar product of two vectors 
    //using recursion 

    if (a == [] | b == []) then 
     s = "" 

    elseif (max(size(a)) ~= max(size(b))) | ... 
      (min(size(a)) ~= min(size(b))) | ... 
      (min(size(a)) ~= 1) then 
     error("vectorMulf: Wrong dimensions") 

    else 
     s = addf(mulf(a(1), b(1)) , scaProd(a(2:$), b(2:$))) 

    end 
endfunction 

function s = matrixMulf(a,b) 
    //matrix multiplication 

    acols = size(a,'c'); 
    brows = size(b,'r'); 
    if acols ~= brows then 
     error("matrixMulf: Wrong dimensions") 
    end 

    arows = size(a,'r'); 
    bcols = size(b,'c'); 
    s = string(zeros(arows,bcols)); 

    for i = 1 : arows 
     for j = 1 : bcols 
      s(i,j) = scaProd(a(i,:),b(:,j)'); 
     end 
    end 
endfunction 

function s = addP(a) 
    //encolses each element of a in a pair of parenthesis 
    s = string(zeros(a)); 

    for i = 1 : size(a,'r') 
     for j = 1 : size(a,'c') 
      s(i,j) = "(" + a(i,j) + ")" 
     end 
    end 
endfunction 

ここにその出力例を示します。あなたが望む結果については

193. 44. 
    437. 100. 

!1*(5*9+6*1)+2*(7*9+8*1) 1*(5*0+6*2)+2*(7*0+8*2) ! 
!             ! 
!3*(5*9+6*1)+4*(7*9+8*1) 3*(5*0+6*2)+4*(7*0+8*2) ! 

、あなたが実行する必要があります:テストコード:

A = [1 2; 3 4]; 
B = [5 6; 7 8]; 
C = [9 0; 1 2]; 
disp(A*B*C) 
As = string(A); 
Bs = string(B); 
Cs = string(C); 
disp(matrixMulf(As,addP(matrixMulf(Bs, Cs)))) 

コンソール出力

  1. addP()
  2. を使用して括弧を使用して行列の各学期ごと囲み
  3. matrixMulf(t1,addP(matrixMulf(t2,t3)))のようなシンボリック乗算を実行します。ここで、t1,t2t3はあなたのマトリックスの囲まれたバージョンです。

そして、2つの最終ノート:

  • それは正しい結果を得るために、各乗算ステップでaddPを使用することが重要です。私が与えた例で()を削除することで確認できます。結果は正しくありません。
  • 機能mulfおよびaddfは、Scilab 6.0.0では使用できません。したがって、Scilabを現在の安定版にアップグレードすると、それらを使用することはできません。