Matlab repr函数

6
在Matlab中,可以使用eval函数将任意字符串作为代码进行评估。例如:
s = '{1, 2, ''hello''}'  % char
c = eval(s)              % cell

有没有办法执行反向操作,即从 c 恢复 s 的文字字符串表示形式?就像这样
s = repr(c)

Python内置了这样一个repr函数,但我在Matlab中没有找到类似的东西,也不知道如何实现它。

我所知道的最接近的东西就是disp(c),它会以“可读”格式而不是字面代码格式打印出c的表示。


那么你不能将一个函数作为另一个参数传递。但是你可以使用functions()函数来处理函数句柄的方式来实现这一点。 - percusse
让我重新表述一下:假设存在这样的函数,称之为matrepr。你不能将参数传递为matrepr(cos)matrepr(inv)。你可以使用func2str(@cos)这样的方式。 - percusse
没关系,例如 cos 不是一个字面量。如果我能让它在问题的示例中工作,那么解决方案就足够通用了。 - jmd_dk
你是否已经看过Python引擎PIA来做这件事?http://www.mathworks.com/help/matlab/matlab-engine-for-python.html - Andy Campbell
@AndyCampbell 不,但它看起来也很有前途,特别是如果你可以从Python中调用自己的Matlab脚本。 - jmd_dk
显示剩余5条评论
3个回答

7

在Matlab中最接近的函数是mat2str,该函数适用于数字、字符或逻辑2D数组(包括向量)。但它不适用于ND数组、单元格数组、结构体数组或表格。

示例:

>> a = [1 2; 3 4]; ar = mat2str(a), isequal(eval(ar), a)
ar =
    '[1 2;3 4]'
ans =
  logical
   1

>> a = ['abc'; 'def']; ar = mat2str(a), isequal(eval(ar), a)
ar =
    '['abc';'def']'
ans =
  logical
   1

在这个相关问题和答案中,你可以看到:

  • 我编写了一个函数,用于获取任意嵌套的单元、数字、字符或逻辑数组的二维单元数组的字符串表示。
  • 如何在Octave中对任意数据类型执行所需操作。

3

好的,我了解您的痛点。

我的建议仍然是提供类似于toString的函数,利用fprintfsprint和其他相关函数,但我明白如果您不知道数据类型并且需要处理多个子情况,这可能会很麻烦。

对于快速修复,您可以使用evalc与您提到的disp函数。

像这样的代码应该可以工作:

function out = repr(x)
    out = evalc('disp(x)'); 
end

或者简洁地说
repr = @(x) evalc('disp(x)');

确实,“evalc”是解决方案的一部分。是的,看起来可以沿着toString的思路拼凑出一些东西,但这需要相当多的工作。 - jmd_dk
@jmd_dk,是的:我建议使用“toString”的方法。如果你有时间(并且愿意走这条路),可能我会识别你的数据的底层类,然后根据大小创建一个字符串(例如)。你甚至可以使用iscell、ischar等。另一种方法是走面向对象编程的路线,将你的数据封装在一个类中,该类定义了你的“toString”方法;例如,你定义了一个“PrintableData”类,然后通过继承实现“PrintableCell”、“PrintableArray”等。只是一些想法(可能你已经考虑过了)。 - pacta_sunt_servanda

2

根据您想要实现的目的,您的用例可能可以使用matlab.io.saveVariablesToScript解决。

这里是相关文档。

希望对您有所帮助!


非常酷。不过有两个抱怨:生成的.m文件会构建复杂的数据结构,而不是将它们写成单行文字;结果似乎必须保存到文件中,而我更喜欢将结果作为字符串。除此之外,这是目前为止最好的答案。 - jmd_dk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接