Подтвердить что ты не робот

Доступна нулевая индексация в MATLAB

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Короче говоря, изменение того, как встроенные типы обрабатывают индексирование, даже отдаленно невозможно. Существует, однако, еще один (хотя и несколько предательский) вариант с использованием подкласса в системе MOTLAB OOP. Например, вы можете создать новый класс double_zb, который наследуется от встроенного класса double:

classdef double_zb < double
   methods
      function obj = double_zb(data)
         if nargin == 0
            data = 0;
         end
         obj = [email protected](data); % initialize the base class portion
      end
   end
end

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

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

Ответ 3

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

а (1+ (0: т))

Источник: http://www.mathworks.com/matlabcentral/newsreader/view_thread/11510

Я предполагаю, что "1+" пришел из ppl, живущего в мире с одной базой: добавьте его, чтобы сделать индекс на основе одного.

Ответ 4

Одним словом: no...

Ответ 5

Я использую 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. Таким образом, избегая необходимости изменять все мои уравнения.