MATLAB 中是不是提供基于零的索引

Posted

技术标签:

【中文标题】MATLAB 中是不是提供基于零的索引【英文标题】:Is zero based indexing available in MATLABMATLAB 中是否提供基于零的索引 【发布时间】:2010-11-21 19:38:50 【问题描述】:

C 中 n 长度数组的索引从 0:N-1 开始。而在 MATLAB 中它来自 1:N

现在,我对 C 风格的索引更满意了。有没有办法告诉 MATLAB,通过在我的 MATLAB 脚本中包含一些命令或其他什么,采用 C 风格的索引而不是传统的 1:N 索引?

【问题讨论】:

作为一个经常使用 MATLAB 上课的人,我无法告诉你我多么希望这一切成为可能。那个并且能够做一个var++;但是唉,MATLAB有一个地方,那个地方不在严肃的非数学编程中。 在不破坏代码的情况下将这样的功能添加到 MATLAB 可能是一项有趣的任务。 @zellus - “定义有趣。” ; “天哪,天哪,我们都要死了” 【参考方案1】:

不,我认为差异源于数学家从 1 开始计数这一事实。(并不是说 MATLAB 更适合数学家,相反它被工程师更多地使用(与 Mathematica 或 Maple 相比,其符号处理是更强大))

如果您想编写从零开始的代码,但与 MATLAB 类似,请查看NumPy and SciPy,Python 包。

另请参阅Why numbering should start at zero 以了解有关基于零和基于一的索引的一般注释,以及MATLAB indexing issue 以了解 MATLAB 特定讨论。请参阅https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi 在 Python 中对此进行讨论。

【讨论】:

来自***的精彩概述:en.wikipedia.org/wiki/… 我是一名数学家,我从 0 开始计数。:( 更严重的是,数学家习惯于用 t=0,t=1,... 等来索引时间。Matlab 经常用于数值分析(微分方程),初始条件始终为 0。例如 y(0) = 初始值。 Real mathematicians 从 0 开始计数。【参考方案2】:

可以通过重载函数 SUBSREF 和 SUBSASGN 来为您想要更改索引方案。在my answer 到this question 中给出了一种为内置类型重载方法的示例。缺点?...

这将是一项艰巨的任务。 它会破坏所有依赖于从一为基础的索引的内置函数,这意味着您基本上必须重写大部分 MATLAB。 您可能想要使用 from other MATLAB users 的任何代码(也依赖于基于 1 的索引)都必须重写。

简而言之,改变内置 类型处理索引的方式甚至是遥不可及的。然而,还有另一个(尽管仍然有些危险)使用subclassing in MATLAB's OOP system 的选项。例如,您可以创建一个继承自内置 double 类的新类 double_zb

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

然后,您可以扩展 double_zb,使用从零开始的索引的 SUBSREF 和 SUBSASGN 的专门实现。但是,在代码中有效地使用double_zb 对象而不是double 对象可能需要您重新实现double 对象的所有其他方法,或者以某种方式实现转换器方法以将double_zb 对象与double 方法一起使用.我什至不确定这样做所涉及的所有细节,但我可以肯定地说这将是一个巨大的头痛。

我的终极建议...不要担心,学会爱上基于一的索引。 ;)

【讨论】:

无法停止思考 J.W. 的《魔法师的学徒》。读这篇文章时歌德。 至于重载 SUBSREF 和 SUBSASGN 就像开头指出的那样,不能在每次想要使用基于 0 的索引时设置一个全局逻辑变量,并让重载的 SUBSREF 和 SUBSASGN 检查如果不存在该变量并使用基于 1 的经典索引? ;-)【参考方案3】:

实际上,Matlab 可以使用从零开始的索引。它们用 一个(不幸的是相当低的优先级并且相当模糊 记录)前缀运算符“1+”,即

a(1+(0:m))

来源: http://www.mathworks.com/matlabcentral/newsreader/view_thread/11510

我想“1+”来自生活在单基世界中的人们:加一以形成基于一的索引。

【讨论】:

这不是从零开始的索引。 1+ 只是将标量值 1 添加到向量 (0:m) 中的所有条目,创建一个从 1 开始的索引 1:(m+1),用于索引 a 是的,但这是一个微不足道的问题——但很有用——当您需要您的代码在视觉上匹配从零开始的公式时修复【参考方案4】:

我使用 Matlab 进行数学运算,我们经常使用“start at time = 0”。我对此的解决方案是编写一个函数:

time(x) = x + 1

例如,如果我有一个数组 y = [0,1,2,3,4] 分别表示 y 在时间 0,1,2,3,4 的值。我可以这样做:

y(time(0))

这会产生正确的结果 0。因此不必修改我的所有方程式。

【讨论】:

以上是关于MATLAB 中是不是提供基于零的索引的主要内容,如果未能解决你的问题,请参考以下文章

C# - 基于零的字符串错误 [重复]

基于matlab的索引OFDM系统误码率仿真

基于 Matlab 的点网应用程序的托管服务提供商

python 基于单位的闭区间切片到基于零的半开区间切片,支持反向步幅

为啥 Stack 使用基于 1 的索引而不是 Java 中的 Array 中的基于 0 的索引?

Matlab系列基于Matlab的基本语音处理实现