-2

単純な matlab 関数の 1 つを改善したいと思います。この関数を実装する算術的な方法はありますか? そのほうがずっといいパフォーマンスができると思います。

function img_output = cutchannels(img_input, min, max)
[r c l] = size(img_input);
img_output = double(img_input);

for i = 1:r
    for j = 1:c
        for k = 1:l
            if(img_output(i:j:k)> max)
                img_output(i:j:k) = max;
            elseif(img_output(i:j:k) < min)
                img_output(i:j:k) = min;
            end
        end
    end
end
end
4

2 に答える 2

6

私の理解が正しければ、これがあなたのやりたいことです

function img_output = cutchannels(img_input, min, max)

img_output = double(img_input);
img_output(img_output>max) = max;
img_output(img_output<min) = min;

end

まず第一に、インデックス付けに間違いがあると思います:img_output(i:j:k)実際には読むべきですimg_output(i,j,k)- これは 3D 配列にインデックスを付ける方法です。

上記は、MATLAB で論理インデックスを使用する標準的な方法です (詳細については、こちらを参照してください)。ステートメント

img_output>max

のサイズに等しいサイズの 0/1 配列を返しますimg_output。ここで、その中のすべての要素は 1img_outputより大きいですmax。次に、この行列を のインデックスとして使用できます。img_output

img_output(img_output>max)

これにより、論理インデックスが 1 に等しいエントリのみが選択img_outputされます。その後、任意の値を割り当てることができます。

img_output(img_output>max) = max

または、補足として、それらに対して他の操作を行います。

img_output(img_output>max) = img_output(img_output>max).^2;
于 2012-10-19T15:18:09.543 に答える
2

あなたはそれをもっと短くすることができます:

function img = cutchannels(img, min_val, max_val)
    img = min( max(double(img),min_val), max_val );
end

これは、なぜこれを関数に実装したいのかという疑問を投げかけます (たとえば、必要な場所でこのワンライナーを使用しないのはなぜですか?)

アドバイスとして: minandmaxは組み込みの Matlab 関数の名前です。合法ではありますが、それらを変数名としても使用することはお勧めできません。たとえば、何が

M = max(max, 5)

つまり、max変数名はいつですか?変数を入力として、変数にインデックスを付けているか、関数をmax呼び出していますか? あなただけでなく、Matlab のパーサーも混乱します。アドバイス:上記の関数のように、またはのような他の変数名を使用してください。maxmaxminimummaximum

于 2012-10-19T19:18:06.033 に答える