2

私は Mathematica プログラミングの初心者で、助けが必要です。任意の配列の要素を取得し、Math LibreOffice で使用するために特別にフォーマットされた文字列を作成する関数を作成しようとしています。

私のコードは次のとおりです。

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 )"

これは期待される出力ではありませんが、エラーを見つけることができません。

ありがとう。

4

1 に答える 1

2

まず、配列を表す文字列を取得します。

私は 1 文字の変数名が嫌いで、定義する変数名の最初に小文字を使用するという Mathematica の規則に従っています)。

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 の初心者にありがちな基本的な間違いを犯しました. ループを使用することは、命令型の手続き型コードを書いていることの確かな兆候です。これは、ほとんどの場合、時間の非効率的な使用です (私が書いたコードは、あなたが書いたコードよりもはるかに短く、使用する関数が少ないことに注意してください)。パソコンの時間の使い方。もちろん、後者はそれほど重要ではありませんが、興味がある場合は、あなたのアプローチと私のアプローチにかかった時間を比較してください。

于 2013-08-18T17:07:19.203 に答える