是否可以使GNU Octave与其内容一起输出矩阵尺寸?例如,它应该产生smth。像这样:
octave:1> X = [1 2; 3 4]
X [2x2] =
1 2
3 4
octave:2> X(1,:)
ans [1x2] =
1 2
答案 0 :(得分: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
这样您可以覆盖类display
的{{1}}方法,并获得您所描述的内容。但是,这不适用于double
,int8
或logical
等其他类。您必须覆盖您感兴趣的所有类的方法。示例:
cell
答案 1 :(得分:8)
虽然Mohsen's answer确实完成了这项工作,但我觉得单独的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
答案 2 :(得分: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
答案 3 :(得分: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]}')
请注意,对于简单输入,它可以采用方便的命令语法,并且您需要函数表单,其中包含字符串形式的命令,用于复杂输入(包含分号或撇号)。
答案 4 :(得分: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