2013-08-18 41 views
2

我是Mathematica編程中的新手,我需要一些幫助。我試圖編寫一個函數來獲取任意數組的元素,並構建一個特定格式的字符串以在Math LibreOffice中使用。從數組中創建字符串的函數(Mathematica)

我的代碼如下:

OOForm[MM_] := 
    (strMM = "left (matrix{"; 
    For[i = 1, i < Dimensions[MM][[1]], i++] { (* not last row *) 
     For[j = 1, j < Dimensions[MM][[2]], j++] { (* not last element from the row *)  
     strMM = strMM <> ToString[MM[[i, j]], InputForm] <> "#"; 
     }; (* last element from the row *) 
     strMM = strMM <> ToString[MM[[i, Dimensions[MM][[2]]]], InputForm] <> "##"; 
    }; 
    For[j = 1, j < Dimensions[MM][[2]], j++] { (* last row without the last element *) 
     strMM = strMM <> ToString[MM[[Dimensions[MM][[1]], j]], InputForm] <> "#"; 
    }; (* last element *) 
    strMM = strMM <> ToString[MM[[(Dimensions[MM][[1]]), Dimensions[MM][[2]]]], InputForm] <> "} right)"; 
strMM; 
) 

有了這樣的輸入:

A = {{3/2, -1, -2, -2, -2}, {0, 3, 6, 10, 14}, {-6, 3/2, 5, 5, 5}, {19/2, -7, -35/2, -24, -61/2}}; 

預期輸出是:

"left (matrix{3/2#-1#-2#-2#-2##0#3#6#10#14##-6#3/2#5#5#5##19/2#-7#-35/2#-24#-61/2} right)" 

但它拋出這個輸出:

"left (matrix{-61/2#-61/2##-61/2#-61/2} right)" 

這不是預期的輸出,但我無法找到該錯誤。

謝謝。

回答

2

首先得到一個代表你的數組的字符串。

我討厭的單字母的變量名,和我按照使用用於I定義的變量名的初始小寫字母的數學慣例),以便讓

myArray = {{3/2, -1, -2, -2, -2}, {0, 3, 6, 10, 14}, {-6, 3/2, 5, 5, 5}, {19/2, -7, -35/2, -24, -61/2}}; 

然後

myArrayString = ToString[myArray,InputForm]; 

StringReplace[myArrayString,{" " -> "", "," -> "#", "{{" -> "left (matrix{", "}}" 
-> "} right)", "}" -> "#", "{" -> ""}] 

返回你想要的字符串。

如果你想有一個函數來做到這一點,只是粉碎它一起這樣的:

ooForm[arr_List]:= StringReplace[ToString[arr,InputForm], 
    {" " -> "", "," -> "#", "{{" -> "left (matrix{", "}}" 
    -> "} right)", "}" -> "#", "{" -> ""}] 

您共同做出一個基本的錯誤初來乍到的Mathematica。使用循環肯定表明您正在編寫命令式的過程式代碼,這幾乎總是對您的時間使用效率低下(請注意,我編寫的代碼比您編寫的代碼短得多,功能更少),效率低下使用你的電腦的時間。後者當然不太重要,但如果您有興趣比較您的方法和我的方法花費的時間。

+0

非常感謝您的回答,這很好。你說得對,我試圖將C風格的編程移植到Mathematica,就是這樣。 :) –