Доступна ли индексация с нуля в MATLAB - PullRequest
18 голосов
/ 21 ноября 2010

Индексирование массива n-длины в C от 0: N-1.в то время как в MATLAB он равен 1: N

Теперь мне удобнее индексирование в стиле C.Есть ли способ сказать MATLAB, включив какую-то команду в мои сценарии MATLAB или что-то еще, чтобы принять индексацию в стиле C, а не традиционную индексацию 1: N?

Ответы [ 5 ]

10 голосов
/ 21 ноября 2010

Нет, и я считаю, что разница связана с тем, что математики начинают считать с 1. (не то, чтобы MATLAB больше подходил для математиков, наоборот, он больше используется инженерами (по сравнению с Mathematica или Maple, чья символьная обработкаболее мощный))

Если вы хотите кодировать на основе нуля, но похоже на MATLAB, посмотрите на NumPy и SciPy , пакеты Python.

Также см. Почемунумерация должна начинаться с нуля для замечаний на основе нуля по сравнению с индексированием на основе одного в целом, и проблема индексации MATLAB для конкретного обсуждения MATLAB.См. https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi для обсуждения этого в Python.

9 голосов
/ 21 ноября 2010

Вы могли бы потенциально сделать что-то подобное, перегрузив функции SUBSREF и SUBSASGN для всех различных типов объектов (встроенных или определенных пользователем).) для которого вы хотите изменить схему индексации.Пример одного способа перегрузки методов для встроенных типов приведен в мой ответ на этот вопрос .Недостатки? ...

  • Это было бы большим и коварным делом.
  • Это сломало бы все встроенные функции, основанные на индексации по одному, что означает, что выВам пришлось бы в основном переписать большую часть MATLAB.
  • Любой код, который вы могли бы использовать от других пользователей MATLAB , который также полагался бы на индексацию на основе одного, должен был бы быть переписан.

Короче говоря, изменение способа индексирования встроенных дескрипторов даже удаленно невозможно.Однако есть еще один (хотя и несколько коварный) вариант, использующий подклассы в ООП-системе MATLAB .Например, вы можете создать новый класс 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

Затем вы можете расширить double_zb с помощью специализированных реализаций SUBSREF и SUBSASGN , которые принимают нулевые индексы.Тем не менее, для эффективного использования double_zb объектов вместо double объектов в вашем коде может потребоваться повторная реализация всех других методов для объектов double или каким-либо образом реализовать методы конвертера для использования double_zb объектов с методами double,Я даже не уверен во всех деталях, связанных с этим, но могу с уверенностью сказать, что это будет колоссальная головная боль.

Мой окончательный совет ... перестаньте беспокоиться и научитесь любить основанную на одноминдексации.;)

7 голосов
/ 27 июля 2011

На самом деле, Matlab может использовать индексы, начинающиеся с нуля.Они обозначены префиксным оператором префикса «1+» (к сожалению, довольно низким приоритетом и довольно мало документированным), то есть

a (1+ (0: m))

source: http://www.mathworks.com/matlabcentral/newsreader/view_thread/11510

Полагаю, «1+» происходит от людей, живущих в мире с одним основанием: добавьте единицу, чтобы создать индекс на основе одного.

3 голосов
/ 31 мая 2013

Я использую Matlab для математики, и мы часто используем «start at time = 0».Моим решением этого было написать функцию:

time(x) = x + 1

Например, если у меня есть массив y = [0,1,2,3,4], представляющий значения y в момент времени 0,12,3,4 соответственно.Я могу сделать это:

y(time(0))

, который дает правильный результат 0. Таким образом, избегая необходимости изменять все мои уравнения.

3 голосов
/ 21 ноября 2010

Одним словом: нет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...