2014-01-22 66 views
2

有沒有一種功能或技術用於將MATLAB的符號表達式轉換爲可以元素明智地評估的表達式?MATLAB符號輸出與元素明智的操作

作爲一個例子,命令

a = solve('x^2 + a*x + b == 0') 

給出輸出

a = 
    (a^2 - 4*b)^(1/2)/2 - a/2 
- a/2 - (a^2 - 4*b)^(1/2)/2 

所需的輸出,然而,它允許ab是數組,是

a = 
    (a.^2 - 4*b).^(1/2)/2 - a/2 
- a/2 - (a.^2 - 4*b).^(1/2)/2 

回答

5

solve('x^2 + a*x + b == 0')返回一個2×1符號。我知道你想評估各種a和b值的解決方案。爲此,首先需要使用matlabFunction將您的sym轉換爲函數。

s = solve('x^2 + a*x + b == 0'); 
f = matlabFunction(s); 

現在f是兩個輸入參數a和b的函數。嘗試使用三個a和b值的兩個向量:

f([1 2 3],[1 1 1]) 

您將得到一個2x3陣列的解決方案。

您還可以使用潛艇達到你想要做什麼:

subs(s,{'a' 'b'},{[1 2 3 ] [1 1 1]}) 

將取代[1 2 3]和[111] b和返回的2x3符號。如果你想評估它,只需使用評估:

eval(subs(s,{'a' 'b'},{[1 2 3 ] [1 1 1]})) 
0

我相信你有幾個操作要轉換。

你實際上可以替代它(^ 2 - 4 * B)^(1/2)/ 2 - a./2

取決於我建議3個不同的解決方案,有多少不同變量在表達式中有:

  • 如果您只有少於幾十個變量,則可能更容易做一個「CTRL-F」(搜索和替換),並將每個變量「var」替換爲他們的等效「變種」。在你的代碼中。確保檢查「整個單詞」。 這應該不到一分鐘。
  • 如果你有少於幾十個變量,但表達式分成幾個不同的文件,你可能想要下載記事本++並做同樣的事情。 Notepadd ++添加了一個選項,用於替換文件夾和子文件夾中的&而不是直接替換文件。這會爲你節省很多時間。
  • 如果您有很多不同的變量,您可能需要查看regexp,並針對文件中出現的每個字符串執行搜索並用reg表達式替換。創建一個新的matlab函數,以您需要的方式實現regexprep。

編輯:我只是注意到,你需要小心括號。 (a。^ 2 - 4 * b)。^(1/2)/ 2 - a./2作品 (a。^ 2 - 4 * b。)。^(1/2)/ 2 - 「VAR)」 a./2不起作用

所以如果你做CTRL-F的方法,你將需要更換的「VAR)」結尾

+0

更換所有'*'機智''*'等將會更容易。 – Daniel

+2

有一個名爲'vectorize'的舊函數,它的歷史可以追溯到'inline'的日子,我相信它仍然被一些符號工具箱代碼引用。如果你輸入'edit vectorize',你會發現它幾乎沒有字符串替換('strrep')。不幸的是,它只適用於標量函數,並且它返回一個字符串。 – horchler

1

爲了得到只是你要求的字符串,存在一個MATLAB函數來做到這一點。它被稱爲vectorize

查看此處的更多信息in the MATLAB documentation。該函數插入一個。在任何^,*或/之前。結果是一個字符串。