如何输出矩阵尺寸及其内容?

psi*_*lia 12 matlab octave

是否有可能使GNU Octave与其内容一起输出矩阵尺寸?例如,它应该产生smth.像这样:

octave:1> X = [1 2; 3 4]

X [2x2] =

   1   2
   3   4


octave:2> X(1,:)

ans [1x2] =

   1   2
Run Code Online (Sandbox Code Playgroud)

Moh*_*nia 17

在MATLAB中,使用以下内容在路径中display.m名为@doublesomewhere 的文件夹中创建:

function display(v)
name = inputname(1);
if isempty(name)
    name = 'ans';
end
s = num2cell(size(v));
fprintf('\n%s [%d%s] =\n\n', name, s{1}, sprintf('x%d', s{2:end}));
builtin('disp', v);
end
Run Code Online (Sandbox Code Playgroud)

这样,您可以覆盖display类的方法double,并获得您所描述的内容.但是,这不适用于其他类int8,logicalcell.您必须覆盖您感兴趣的所有类的方法.示例:

>> A=ones(2,2,2)

A [2x2x2] =

(:,:,1) =
     1     1
     1     1
(:,:,2) =
     1     1
     1     1
Run Code Online (Sandbox Code Playgroud)

  • Mohsen,如果你真的想要花哨,你应该测试`get(0,'FormatSpacing')`以查看MATLAB是否具有`format compact`或`format loose`,并调整你的函数显示的换行数. (3认同)
  • 据推测,新发布的R2013b有一种新的方式来定制对象的显示:http://www.mathworks.com/help/matlab/ref/matlab.mixin.customdisplayclass.html (2认同)
  • @Amro我的理解是它适用于用户定义的类,不能用于像`double`这样的内置类. (2认同)

Eit*_*n T 8

虽然Mohsen的答案确实完成了这项工作,但我觉得单独的m文件对于此目的来说有点过分(特别是如果你不想让你的目录与其他m文件混乱).我建议使用本地匿名函数单行代码(让我们命名dispf),所以这里是它的演变阶段:)

我想出的基本匿名功能是:

dispf = @(x)fprintf('%s =\n\n%s\n', inputname(1), disp(x));
Run Code Online (Sandbox Code Playgroud)

这当然等同于输入语句后命令窗口中的输出(当然不是以分号结尾).好吧,差不多......因为如果inputname返回一个空字符串,它就不会打印'ans'(它应该).但这可以纠正:

dispf = @(x)fprintf('%s=\n\n%s\n', ...
    regexprep([inputname(1), ' '], '^ $', 'ans '), ...
    disp(x));
Run Code Online (Sandbox Code Playgroud)

这基本上regexprep用于匹配空字符串并替换它'ans'.最后,我们在变量名后附加维:

dispf = @(x)fprintf('%s%s =\n\n%s\n', ...
    regexprep([inputname(1), ' '], '^ $', 'ans '), ...
    strrep(mat2str(size(x)), ' ', 'x'), ...
    disp(x));
Run Code Online (Sandbox Code Playgroud)

现在你可以将这个单行插入任何脚本,而无需额外的m文件!

只是证明它有效:

dispf = @(x)fprintf('%s%s =\n\n%s\n', ...
    regexprep([inputname(1), ' '], '^ $', 'ans '), ...
    strrep(mat2str(size(x)), ' ', 'x'), ...
    disp(x));

A = [1 2; 3 4];
dispf(A)
dispf(A(1, :))
Run Code Online (Sandbox Code Playgroud)

结果如预期:

A [2x2] =

   1   2
   3   4

ans [1x2] =

   1   2
Run Code Online (Sandbox Code Playgroud)


Moh*_*nia 6

我不知道它是否适用于Octave,但是在MATLAB中你可以使用format debug命令并获得数组的尺寸以及更多:

>> format debug
>> X = [1 2; 3 4]

X =


Structure address = 7d19498 
m = 2
n = 2
pr = 373bafa0 
pi = 0
     1     2
     3     4
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,在Octave`格式debug`中会触发错误(参见[示例](http://ideone.com/MLlu1o))... (2认同)