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 中是不是提供基于零的索引的主要内容,如果未能解决你的问题,请参考以下文章
python 基于单位的闭区间切片到基于零的半开区间切片,支持反向步幅