2017-10-28 78 views
6

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

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

有没有办法做相反的操作;获取任意变量的文字字符串表示形式?也就是说,从c恢复s? 喜欢的东西

s = repr(c) 

这样的repr功能被内置到Python,但我还没有穿过在Matlab这样的事情来,我也不看如何实现它自己一个明确的办法。

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

+0

我不认为你可以这样在matlab中这样做,也许以其他方式。由于咒语*功能是第一类公民*你可以用Python来完成。这不是matlab的情况。 – percusse

+0

为什么这是一个限制因素? –

+0

然后,您不能将一个函数作为参数插入另一个函数。你可以使用'functions()'函数来处理函数句柄。 – percusse

回答

2

取决于究竟为什么要做到这一点,你的使用情况可matlab.io.saveVariablesToScript

Here解决的是为它的文档。

希望有帮助!

+0

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

3

好吧,我看到你的痛苦。

我的建议仍然是提供排序toString凭借fprintfsprint,和朋友的功能,但据我所知,这可能是乏味的,如果你不知道数据的类型,还需要几个子情况。

为了快速解决问题,您可以使用evalc和您提到的disp函数。

像这样的东西应该工作:

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

或者简洁

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

确实'evalc'是解决方案的一部分。是的,似乎可以沿着[toString](https://se.mathworks.com/matlabcentral/fileexchange/38566-string-representation-of-any-data-type)的方式破解一些东西,虽然这将需要相当多的工作。 –

+0

@jmd_dk,yup:我会给'toString'的建议。如果您有时间(并且愿意走这条路),可能我会识别数据的基础类,然后根据大小(例如)创建一个字符串。您甚至可以使用iscell,ischar等。另一种方法是使用OOP方式,并将数据封装在定义'toString'方法的类中;例如你定义一个'PrintableData'类,然后通过继承实现'PrintableCell','PrintableArray'等等。只是一些想法(可能你已经考虑过了)。 –

6

最近有在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可以看到:

  • 我写用于获得2D单元阵列的字符串表示与任意嵌套细胞,数字,字符或逻辑阵列A功能。
  • 如何在Octave中为任意数据类型做什么。