12

是否可以让 GNU Octave 输出矩阵尺寸及其内容?例如,它应该产生 smth。像这样:

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

X [2x2] =

   1   2
   3   4


octave:2> X(1,:)

ans [1x2] =

   1   2
4

5 回答 5

17

在 MATLAB 中,使用以下内容在路径中某处display.m的文件夹中创建:@double

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

这样您就可以覆盖displayclass 的方法double,并获得您所描述的内容。但是,这不适用于int8,logical或等其他类cell。您必须覆盖您感兴趣的所有类的方法。示例:

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

A [2x2x2] =

(:,:,1) =
     1     1
     1     1
(:,:,2) =
     1     1
     1     1
于 2013-09-12T09:27:44.387 回答
8

虽然Mohsen 的回答确实起到了作用,但我觉得单独的 m 文件为此目的有点过头了(特别是如果你不想用额外的 m 文件弄乱你的目录)。我建议使用本地匿名函数单线代替(让我们命名它dispf),所以这里是它的演变阶段:)

我想出的基本匿名函数是:

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

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

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

这基本上是regexprep用于匹配一个空字符串并将其替换为'ans'. 最后,我们在变量名之后附加维度:

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

现在,您可以将这一单行代码插入到任何脚本中,而无需额外的 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, :))

结果如预期:

A [2x2] =

   1   2
   3   4

ans [1x2] =

   1   2
于 2013-09-12T18:10:28.557 回答
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
于 2013-08-28T17:13:43.603 回答
1

这是另一个。您可以@double/display像其他人解释的那样使用它来重载,或者将其命名为其他名称并将其用作您自己的自定义显示功能:

function display(x)
    % determine whether format is loose or compect
    loose = strcmp(get(0,'FormatSpacing'), 'loose');

    % print name or ans
    name = inputname(1);
    if isempty(name), name = 'ans'; end
    if loose, disp(' '); end
    disp([name ' =']);
    if loose, disp(' '); end

    % print size
    sz = size(x);
    if length(sz) == 2
        fprintf('    %s: %d-by-%d\n', class(x), sz(1), sz(2));
    elseif length(sz) == 3
        fprintf('    %s: %d-by-%d-by-%d\n', class(x), sz(1), sz(2), sz(3));
    else
        fprintf('    %s: %d-D\n', class(x), numel(sz));
    end
    if loose, disp(' '); end

    % print array
    disp(x);
end

请注意,我稍微改变了输出的格式:

>> format compact;
>> x = magic(5);
>> display(x)
x =
    double: 5-by-5
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9
于 2013-09-12T22:57:42.910 回答
1

这是另一种方法。这种方法的优点是它可以处理比上述替代方法更复杂的输入。

function show(s)
t = regexp(s,'=');
if any(t)
    evalin('caller',['disp(size(' s(t+1:end) ')),' s])
else
    evalin('caller',['disp(size(' s ')),' s])
end

要使用它,请保存函数并尝试以下操作:

show x = rand(3)
show('y = {uint8(8);[6 7 8]}')

请注意,对于简单的输入,它可以采用方便的命令语法,对于复杂的输入(包含分号或撇号),您需要带有字符串形式的命令的函数形式。

于 2013-09-12T13:12:12.430 回答