2016-12-07 23 views
4

我有一個包含這樣的數學函數的字符串:使用數組項作爲替代在MATLAB regexpr

sin(x[1]) + cos(x[2]) + tan(x[3]) + x[1] 

現在我想用regexpr的一個字母來代替每個x [數字]。結果應該是這樣的:

sin(a) + cos(b) + tan(c) + a 

所以我定義的字母排列如下:

alphabet = ('a':'z') 

這是我第一次regexpr,只是每x [數字]替換一個「一」:

regexprep(functionString,'x\[(\d+)\]','${alphabet(1)}'); 

我試圖用正確的字母替換,使用的是$ 1而不是1.我認爲這不會使用字母表(1),而是動態地在右邊的字母索引處顯示項目。

regexprep(functionString,'x\[(\d+)\]','${alphabet($1)}'); 

相反,我得到一個錯誤,指數超過矩陣的尺寸。

有人知道我在做什麼錯嗎?我如何得到正確的信件? 在此先感謝!

回答

3

Matlab使用$1輸入作爲文本。由於int32('1') = 49導致錯誤Index exceeds matrix dimensions

爲了解決您的問題,使用str2num

regexprep(functionString,'x\[(\d+)\]','${alphabet(str2num($1))}') 
+0

這工作!但我不知道爲什麼。你能解釋一下(49:74)嗎?謝謝! – selmaohneh

+0

新增說明 – yuval

0

你試過regexprep(functionString,'x\[(\d+)\]','${alphabet($0)}');

從我在這裏看到的:https://de.mathworks.com/help/matlab/ref/regexprep.html正則表達式匹配是基於0的,所以第一個應該是$ 0。

+0

是的。同樣的錯誤。 – selmaohneh

+0

剛試過它:$ 0返回整個比賽x [2]。 $ 1返回2.所以使用字母表($ 1)聽起來更多的邏輯。但仍然有錯誤。 – selmaohneh

1

如果你有興趣,你其實可以不必創建一個alphabet變量做到這一點。具體方法如下:

regexprep(functionString,'x\[(\d+)\]','${char($1+48)}') 

添加48到索引$1並將其轉換爲一個char會給你ASCII字符開始'a'