Введите тип int в Octave / Matlab - PullRequest
3 голосов
/ 01 апреля 2010

Мне нужно вызвать индекс матрицы, созданной с помощью команды linspace и основанной на некоторых данных, взятых с осциллографа. Из-за этого вводимые данные являются двойными. Тем не менее, я не могу позвонить:

Time[V0Found]

где V0Found - что-то вроде 5.2, однако взятие индекса 5 достаточно близко, поэтому мне нужно отбросить десятичную дробь. Я использовал это уравнение, чтобы отбросить десятичную дробь:

V0FoundDec = V0Found - mod(V0Found,1)
Time[V0FoundDec]

Однако, несмотря на то, что десятичная дробь падает, октава все равно жалуется на это.

Итак, что я могу сделать, чтобы привести его к типу int?

Ответы [ 3 ]

5 голосов
/ 01 апреля 2010

В MATLAB это должно быть int8(x) или int16(x) или , одно из других целочисленных значений .

Но я удивлен, что вам нужно сделать это для индексации. Попробуйте

myarray(floor(indexlist))

или

myarray(round(indexlist))

, где myarray - ваш массив, а indexlist - ваш вектор нецелых индексов.


пример:

octave-3.2.3:8> v=rand(1,8)*10+1
v =

   3.1769   1.4397   8.7504   1.7424   6.9413   3.1663   8.4085   9.0179

octave-3.2.3:9> a = (1:1:20).^2
a =

 Columns 1 through 15:

     1     4     9    16    25    36    49    64    81   100   121   144   169   196   225

 Columns 16 through 20:

   256   289   324   361   400

octave-3.2.3:10> a(floor(v))
ans =

    9    1   64    1   36    9   64   81
2 голосов
/ 01 апреля 2010

Вы можете использовать round , floor , ceil функции вместо вашей формулы для округления.

Кстати, индексация выполняется с использованием круглых скобок, а не скобок:

V0FoundDec = round(V0Found);
Time(V0FoundDec) % not Time[V0FoundDec]

В случае, если это была ваша проблема

0 голосов
/ 02 апреля 2010

В Matlab правильный способ сделать это - использовать команду interp1 для интерполяции. Формат этой команды

yout = interp1 (xdata, ydata, xin, ...) или же yout = interp1 (ydata, xin, ...) где xdata тогда предполагается равным 1: длина (ydata)

Если вы хотите получить результат, который вы получите, позвонив по номеру

V0FoundDec = Время (раунд (V0found))

вы бы сказали

V0FoundDec = interp1 (Время, V0found, 'ближайший')

но вы также можете легко получить линейную интерполяцию (по умолчанию) с помощью

V0FoundDec = interp1 (Time, V0found)

или

V0FoundDec = interp1 (Time, V0found, 'linear')

, и вы также можете экстраполировать за пределы (используя «extrap» или предоставляя значение extrap), где

Время (круглый (V0found))

потерпит крах, если раунд (V0found) <1 или> длина (время)

...