Matlab repr 函数

Posted

技术标签:

【中文标题】Matlab repr 函数【英文标题】:Matlab repr function 【发布时间】:2018-04-10 04:39:24 【问题描述】:

在 Matlab 中,可以使用 eval 函数将任意字符串计算为代码。例如

s = '1, 2, ''hello'''  % char
c = eval(s)              % cell

有没有办法做逆运算;获取任意变量的文字字符串表示?即从c恢复s? 类似的东西

s = repr(c)

这样的repr 函数是内置在 Python 中的,但我在 Matlab 中没有遇到过类似的东西,也没有看到如何自己实现它的明确方法。

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

【问题讨论】:

我不认为你可以在matlab中以这种方式这样做,也许以其他方式。由于口头禅函数是一等公民,你可以在Python中做到这一点。这不是 matlab 的情况。 为什么这是一个限制因素? 那么你不能将一个函数作为参数插入另一个函数。例如,您可以使用 functions() 函数来处理函数句柄。 我不想使用函数作为参数。我只是希望 repr(eval(s)) == s 成为 true 对于任何代表文字的 eval'able 字符串 s 让我改写一下:假设存在这样的功能,称之为matrepr。您将无法将参数传递为matrepr(cos)matrepr(inv)。例如你可以做func2str(@cos) 【参考方案1】:

好的,我明白你的痛苦了。

我的建议仍然是利用fprintfsprint 和朋友提供类似toString 的功能,但我知道如果您不知道数据的类型可能会很乏味并且还需要几个子案例。

为了快速修复,您可以将evalc 与您提到的disp 函数结合使用。

这样的事情应该可以工作:

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

简明扼要

repr = @(x) evalc('disp(x)');

【讨论】:

确实evalc 是解决方案的一部分。是的,看起来人们可以按照toString 的方式破解一些东西,尽管这需要相当多的工作。 @jmd_dk,是的:我建议使用“toString”方式。如果您有时间(并且愿意走那条路),我可能会确定您的数据的基础类,然后根据大小(例如)创建大小并创建一个字符串。您甚至可以使用 iscell、ischar 等。另一种方法是采用 OOP 方式并将数据包装在定义您的“toString”方法的类周围;例如您定义一个“PrintableData”类,然后通过继承实现“PrintableCell”、“PrintableArray”等。只是一些想法(可能您已经考虑过)。【参考方案2】:

Matlab 中最接近的是mat2str,它适用于数字、字符或逻辑二维数组(包括向量)。 (它不适用于 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

在这个related question and answers你可以看到:

我编写的一个函数,用于获取具有任意嵌套单元格、数字、字符或逻辑数组的二维单元格数组的字符串表示形式。 如何在 Octave 中为任意数据类型做你想做的事情。

【讨论】:

【参考方案3】:

根据您要执行此操作的确切原因,您的用例可能会使用 matlab.io.saveVariablesToScript 解决

Here 是它的文档。

希望有帮助!

【讨论】:

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

以上是关于Matlab repr 函数的主要内容,如果未能解决你的问题,请参考以下文章

Python中的repr()函数

如何为函数本身设置 repr? [复制]

Python repr() 函数

内置函数repr() /str() /eval()

python-repr()和val()函数

Python内置函数(53)——repr