Как преобразовать этот Python вложенный цикл в MATLAB? - PullRequest
0 голосов
/ 03 ноября 2018

Мне нужно преобразовать следующий цикл Python, вложенный в цикл в MATLAB, но он просто не работает.

for ii in where(obs != 0)[0]:
    ob = obs[ii]
    ncount = int(floor(top / ob))
    for jj in range(ncount):
        l_ind = max(int(floor((ob * (jj + 1) - width / 2.) / top * (G - 1))), 0)
        h_ind = min(int(ceil((ob * (jj + 1) + width / 2.) / top * (G - 1))), G - 1)
        ret[ii, l_ind : h_ind + 1] = tukey(h_ind - l_ind + 1, 0.5)

Мне лично не нужна часть "where (obs! = 0) [0]", потому что мой вектор obs не имеет нулей в этом измерении. Пока что попробовал следующее:

for ii = 1:length(obs)
    ob = obs(ii);
    ncount = floor(top / ob);
    for jj = 1:ncount
        l_ind = max(floor((ob * (jj + 1) - width / 2) / top * (G - 1)), 0);
        h_ind = min(ceil((ob * (jj + 1) + width / 2) / top * (G - 1)), G - 1);
        ret(ii , l_ind : h_ind) = tukeywin(h_ind - l_ind + 1)';
    end
end

В Matlab tukey называется tukeywin, и мне не нужен дополнительный параметр 0.5, потому что это значение по умолчанию. Я также должен был транспонировать tukeywin, как вы можете видеть, чтобы соответствовать размеру, в противном случае выдает мне еще одну ошибку, а также удаляет + 1 из h_ind, вероятно потому, что в Python index начинается с 0, а в Matlab - с 1. Если я оставлю + 1, то мне нужно будет добавить + 2 в функцию tukeywin, чтобы соответствовать размерам по обе стороны уравнения.

Но после этого он все равно не работает, у меня проблемы с последней строкой для генерации матрицы ret. Матрица ret инициализируется нулями и имеет размер 1972 x 1025. Вектор obs имеет размер 1972 x 1. G равен 1025, ширина 300, вершина 22050. Вектор obs содержит числа, например, в диапазоне 100-600, поэтому Вы должны быть в состоянии воссоздать этот вложенный цикл.

Это дает мне ошибку " Указатель в позиции 2 недопустим. Индексы массива должны быть положительными целыми числами или логическими значениями ". Я предполагаю, что это относится к части ret (ii, l_ind: h_ind), ii - это хорошо, она продлится до 1972 года, но я думаю, что l_ind: h_ind дает мне ошибку. Так что я не уверен, как структурировать это в Matlab.

1 Ответ

0 голосов
/ 03 ноября 2018

Без полного тестирования вашего кода, я думаю, что ваша проблема связана с индексированием массивов на основе 0 против 1. Вы ограничиваете l_ind и h_ind до 0 и G-1. Для Matlab вы бы хотели 1 и G.

Я не совсем уверен, что вы делаете в выражениях floor / ceil для определения ваших индексов, но я подозреваю, что логику нужно немного подправить. Самым простым решением, вероятно, является просто +1 l_ind и h_ind строк. В противном случае вам нужно переработать их с индексированием на основе 1 ...

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