如何在MATLAB中转换这个Python嵌套for循环?

如何在MATLAB中转换这个Python嵌套for循环?,python,matlab,loops,for-loop,matrix,Python,Matlab,Loops,For Loop,Matrix,我需要在MATLAB中转换以下Python嵌套for循环,但它就是不起作用 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(i

我需要在MATLAB中转换以下Python嵌套for循环,但它就是不起作用

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,以匹配大小,否则会给我另一个错误,并从h_ind中删除+1,可能是因为在Python中,索引从0开始,在Matlab中,它从1开始。如果我保持+1,那么我必须在tukeywin函数中加入+2,以匹配方程两边的大小

但是在这之后,它仍然不起作用,我在生成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中构造它

如果不完全测试代码,我认为您的问题与基于0和1的数组索引有关。您将
l_ind
h_ind
限制为0和G-1。对于Matlab,您需要1和G


我不确定你在floor/ceil语句中做了什么来确定你的索引,但我怀疑逻辑需要调整一下。最简单的解决方案可能是只+1
l_ind
h_ind
行。否则,您需要使用基于1的索引对它们进行返工…

非常感谢,您完全正确,甚至不确定我是如何遗漏了Matlab和Python之间的简单事实。我还必须修复jj,所以基本上它不是jj+1,只是jj。0变为1,G-1只是G。而且也不需要转置tukeywin函数,但无论如何都可以工作。再次感谢你!