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

首先获取一个代表您的数组的字符串。

我讨厌单字母变量名,并且我遵循 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 回答