Мне нужно преобразовать следующий цикл 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.