亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaScript 數組的 2D 卷積

JavaScript 數組的 2D 卷積

MYYA 2023-07-06 14:54:15
我對 JavaScript 還很陌生。我正在嘗試在 Web 應用程序的 JavaScript 中實現function conv_2d(kernel, array){? ? var result = uniform_array(array.length, uniform_array(array[0].length, 0));? ? var kRows = kernel.length;? ? var kCols = kernel[0].length;? ? var rows = array.length;? ? var cols = array[0].length;? ? // find center position of kernel (half of kernel size)? ? var kCenterX = Math.floor(kCols/2);? ? var kCenterY = Math.floor(kRows/2);? ? var i, j, m, n, mm, nn;? ? for(i=0; i < rows; ++i){? ? ? ? ? // for all rows? ? ? ? for(j=0; j < cols; ++j){? ? ? ? ? // for all columns? ? ? ? ? ? for(m=0; m < kRows; ++m){? ? ? ? ?// for all kernel rows? ? ? ? ? ? ? ? for(n=0; n < kCols; ++n){? ? ? ? // for all kernel columns? ? ? ? ? ? ? ? ? ? // index of input signal, used for checking boundary? ? ? ? ? ? ? ? ? ? var ii = i + (m - kCenterY);? ? ? ? ? ? ? ? ? ? var jj = j + (n - kCenterX);? ? ? ? ? ? ? ? ? ? // ignore input samples which are out of bound? ? ? ? ? ? ? ? ? ? if(ii >= 0 && ii < rows && jj >= 0 && jj < cols){? ? ? ? ? ? ? ? ? ? ? ? result[i][j] += array[ii][jj] * kernel[m][n];? ? ? ? ? ? ? ? ? ? };? ? ? ? ? ? ? ? };? ? ? ? ? ? };? ? ? ? };? ? };? ? return result;};function uniform_array(len, value) {? ? let arr = new Array(len); for (let i=0; i<len; ++i) arr[i] = value;? ? return arr;}現在,我試圖看看我做錯了什么,但我找不到錯誤。我所知道的是,對同一對矩陣應用 2D 卷積,javascript 中的結果給出了輸出矩陣中每行的所有行的總和。我發現與 C++ 中的輸出相比:JavaScript 輸出:0: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]1: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]2: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]3: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]4: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]5: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]6: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]7: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]8: (9) [75, 150, 225, 300, 375, 450, 525, 600, 425]
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

這看起來合適嗎?我更改了uniform_array以使其創建新數組,而不是為每一行指向相同的數組。


const array = [

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

  [1, 2, 3, 4, 5, 6, 7, 8, 9],

];


const kernel = [

  [1,1,1],

  [1,1,1],

  [1,1,1],

];


function uniform_array(len, value) {

    let arr = new Array(len); for (let i=0; i<len; ++i) arr[i] = Array.isArray(value) ? [...value] : value;

    return arr;

}


function conv_2d(kernel, array){

    var result = uniform_array(array.length, uniform_array(array[0].length, 0));

    var kRows = kernel.length;

    var kCols = kernel[0].length;

    var rows = array.length;

    var cols = array[0].length;

    // find center position of kernel (half of kernel size)

    var kCenterX = Math.floor(kCols/2);

    var kCenterY = Math.floor(kRows/2);

    var i, j, m, n, ii, jj;


    for(i=0; i < rows; ++i){          // for all rows

        for(j=0; j < cols; ++j){          // for all columns

            for(m=0; m < kRows; ++m){         // for all kernel rows

                for(n=0; n < kCols; ++n){        // for all kernel columns

                    // index of input signal, used for checking boundary

                    ii = i + (m - kCenterY);

                    jj = j + (n - kCenterX);

                    // ignore input samples which are out of bound

                    if(ii >= 0 && ii < rows && jj >= 0 && jj < cols){

                        result[i][j] += array[ii][jj] * kernel[m][n];

                    };

                };

            };

        };

    };

    return result;

};


conv_2d(kernel, array).forEach(row => console.log(row.join(' ')));


查看完整回答
反對 回復 2023-07-06
  • 1 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號