How to output matrix dimensions together with its content?

后端 未结 5 821
醉话见心
醉话见心 2021-01-02 02:05

Is it possible to make GNU Octave to output matrix dimensions together with its content? For example, it should produce smth. like this:

octave:1> X = [1          


        
5条回答
  •  情歌与酒
    2021-01-02 02:43

    While Mohsen's answer does the job indeed, I felt that a separate m-file is somewhat an overkill for this purpose (especially if you don't want to clutter your directory with additional m-files). I suggest using a local anonymous function one-liner instead (let's name it dispf), so here are its evolution phases :)

    The basic anonymous function I came up with is:

    dispf = @(x)fprintf('%s =\n\n%s\n', inputname(1), disp(x));
    

    which is essentially equivalent to the output in the command window after entering statements (that do not end with a semicolon, of course). Well, almost... because if inputname returns an empty string, it doesn't print 'ans' (and it should). But this can be corrected:

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

    This is basically using regexprep to match an empty string and replace it with 'ans'. Finally, we append the dimensions after the variable name:

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

    Now you can plug this one-liner is into any script without the need for an additional m-file!

    Example

    Just a proof that it's working:

    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, :))
    

    The result is as expected:

    A [2x2] =
    
       1   2
       3   4
    
    ans [1x2] =
    
       1   2
    

提交回复
热议问题