例如,如果我想从中读取中间值magic(5),我可以这样做:
M = magic(5);
value = M(3,3);
Run Code Online (Sandbox Code Playgroud)
得到value == 13.我希望能够做到这样的事情之一:
value = magic(5)(3,3);
value = (magic(5))(3,3);
Run Code Online (Sandbox Code Playgroud)
免除中间变量.然而,MATLAB抱怨Unbalanced or unexpected parenthesis or bracket在第一个括号之前3.
是否可以在不首先将其分配给变量的情况下从数组/矩阵中读取值?
或者等效地,"在Matlab中NumPy的省略号索引的等价物"
说我有一些高维数组:
x = zeros(3, 4, 5, 6);
Run Code Online (Sandbox Code Playgroud)
我想编写一个采用大小数组的函数,(3, ...)并进行一些计算.在NumPy中,我可以这样写:
def fun(x):
return x[0]*x[1] + x[2]
Run Code Online (Sandbox Code Playgroud)
但是,MATLAB中的等效函数不起作用,因为使用一个整数进行索引会将数组展平为1d
function y = fun_bad(x)
y = x(1)*x(2) + x(3)
Run Code Online (Sandbox Code Playgroud)
我可以用最多三维数组来完成这项工作
function y = fun_ok3d(x)
y = x(1,:,:)*x(2,:,:) + x(3,:,:)
Run Code Online (Sandbox Code Playgroud)
如果我希望这适用于多达10维阵列,我可以写
function y = fun_ok10d(x)
y = x(1,:,:,:,:,:,:,:,:,:)*x(2,:,:,:,:,:,:,:,:,:) + x(3,:,:,:,:,:,:,:,:,:)
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免在这里编写愚蠢数量的冒号,只是让它适用于任何维度?是否有一些x(1,...)语法暗示这一点?
NumPy可以在索引表达式中使用...(Ellipsis)文字来表示" :根据需要多次",这将解决此问题.
作为一个玩具示例,我有一个类,它简单地将一个向量或矩阵包装在一个对象中,并包含一个创建时间的时间戳.我试图超载subsref这样
() 引用的工作方式与标准向量和矩阵类型完全相同{}引用的工作方式与引用完全相同()(换句话说,与单元格无关).引用允许我访问对象的私有属性以及非技术属性的其他字段.码:
classdef TimeStampValue
properties (Access = private)
time;
values;
end
methods
%% Constructor
function x = TimeStampValue(values)
x.time = now();
x.values = values;
end
%% Subscripted reference
function x = subsref(B, S)
switch S.type
case '()'
v = builtin('subsref', B.values, S);
x = TimeStampValue(v);
case '{}'
S.type = '()';
v = builtin('subsref', B.values, S);
x = TimeStampValue(v);
case '.'
switch S.subs
case 'time'
x …Run Code Online (Sandbox Code Playgroud) 基本上,我正在寻找一个概括flipud和fliplr翻转nd-array的第i维.
当要翻转的尺寸是第一个时,我想我可以使用
function flipped = flipfirst(ndarr)
sz = size(ndarr);
flipped = reshape(flipud(reshape(ndarr, sz(1), [])), sz);
end
Run Code Online (Sandbox Code Playgroud)
同样,如果要翻转的维度是最后一个,我可以使用
function flipped = fliplast(ndarr)
sz = size(ndarr);
flipped = reshape(fliplr(reshape(ndarr, [], sz(end))), sz);
end
Run Code Online (Sandbox Code Playgroud)
我确信我可以编写更通用的代码,通过调用permute和诸如此类的东西,但是有什么内置的吗?
我不确定reshape上面所有的内容是多么昂贵,但如果是的话,我也会对更有效的非内置方法感兴趣.
我们来定义一下,例如,
x = 10:10:2000;
Run Code Online (Sandbox Code Playgroud)
众所周知,整数值可以用作索引:
>> x(9)
ans =
90
Run Code Online (Sandbox Code Playgroud)
在Matlab中,通常可以在需要数字的地方使用字符,Matlab会自动进行转换.例如,由于ASCII码'a'是97,
>> 'a'+1
ans =
98
Run Code Online (Sandbox Code Playgroud)
字符也可以用作索引吗?Matlab会将它们转换为整数吗?