C中n长度数组的索引是0:N-1。而在MATLAB中则是1:N
现在,我对C风格的索引感觉更舒服。有没有办法告诉MATLAB,通过在我的MATLAB脚本中包含一些命令或其他什么来采用C风格的索引而不是传统的1:N索引?
答案 0 :(得分:10)
不,我相信差异源于数学家从1开始计算的事实。(不是说MATLAB更适合数学家,相反它更多地被工程师使用(与Mathematica或Maple相比,其符号处理是更强大))
如果你想基于零编码,但与MATLAB类似,请查看NumPy and SciPy,Python包。
另请参阅Why numbering should start at zero,了解基于零的与一般基于索引的注释,以及MATLAB indexing issue对于MATLAB特定讨论的注释。有关Python中的讨论,请参阅https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi。
答案 1 :(得分:9)
可能通过为所有不同类型的对象(内置或用户定义)重载函数SUBSREF和SUBSASGN来执行此类操作。想要改变索引方案。 my answer到this question中给出了一种重置内置类型方法的方法示例。缺点?...
简而言之,改变内置类型处理索引的方式甚至不可行。然而,有另一个(虽然仍然有点危险)选项使用subclassing in MATLAB's OOP system。例如,您可以创建一个继承自内置double_zb
类的新类double
:
classdef double_zb < double
methods
function obj = double_zb(data)
if nargin == 0
data = 0;
end
obj = obj@double(data); % initialize the base class portion
end
end
end
然后,您可以使用SUBSREF和SUBSASGN的专门实现扩展double_zb
,这些实现采用从零开始的索引。但是,在代码中有效地使用double_zb
个对象而不是double
个对象可能需要您重新实现double
个对象的所有其他方法,或以某种方式实现转换器方法以使用{{1具有double_zb
方法的对象。我甚至不确定这样做的所有细节,但我当然可以说这将是一个巨大的头痛。
我的终极建议......不要担心并学会热爱基于单一的索引。 ;)
答案 2 :(得分:7)
实际上,Matlab 可以使用从零开始的索引。他们用。表示 (不幸的是,优先级相当低,而且相当模糊 记录)前缀运算符“1+”,即
一个(1+(0:M))
源: http://www.mathworks.com/matlabcentral/newsreader/view_thread/11510
我认为“1+”来自生活在一个基础世界的人:添加一个来制作一个基础的索引。
答案 3 :(得分:3)
总之:不......
答案 4 :(得分:3)
我使用Matlab进行数学运算,并且我们使用“时间开始= 0”。我的解决方案是写一个函数:
time(x) = x + 1
例如,如果我有一个数组y = [0,1,2,3,4],分别表示时间0,1,2,3,4的y值。我可以这样做:
y(time(0))
产生正确的0结果。因此避免必须修改我的所有方程式。