簡體   English   中英

如何在MATLAB中將此Python嵌套的for循環轉換?

[英]how to convert this Python nested for loop in MATLAB?

我需要轉換下面的嵌套在MATLAB中的for循環的Python,但是它不起作用。

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 x1025。obs向量的大小為1972 x1。G為1025,寬度為300,頂部為22050。obs向量包含范圍在100-600之間的數字,例如您應該能夠重新創建此嵌套循環。

它給我錯誤“ 位置2的索引無效。數組索引必須為正整數或邏輯值 ”。 我假設這是指ret(ii,l_ind:h_ind)部分,ii很好,它將一直持續到1972年,但是l_ind:h_ind給了我我認為的錯誤。 所以我不確定如何在Matlab中構造它。

如果沒有完全測試您的代碼,我認為您的問題與基於0對1的數組索引有關。 您將l_indh_ind限制為0和G-1。 對於Matlab,您需要1和G。

我不確定您在floor / ceil語句中正在做什么以確定索引,但是我懷疑邏輯將需要進行一些調整。 最簡單的解決方案可能是僅對l_indh_ind行進行+1。 否則,您需要使用基於1的索引對其進行重做...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM