在Octave中编写'for'的简单方法

Edu*_*ard 3 replace for-loop matrix octave

我在Octave中编写了以下两段代码.

给定矩阵'img',我想:

用0替换所有不等于255的元素:

for i = 1:m
    for j = 1:n
        if (img(i,j) ~= 255)
            img(i,j) = 0;
        endif
    endfor
endfor
Run Code Online (Sandbox Code Playgroud)

将所有负数元素替换为0,将所有大于255的元素替换为255:

for i = 1:m
    for j = 1:n
        if (img(i,j) < 0)
            img(i,j) = 0;
        endif
        if (img(i,j) > 255)
            img(i,j) = 255;
        endif
    endfor
endfor
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来写这个?

Aci*_*ido 9

像MATLAB这样的Octave针对矩阵或矢量计算进行了优化.也就是说,它有很多优化的编译代码,可以很好地处理矩阵乘法或计算逆矩阵或添加两个矩阵等.

另一方面,如果你创建一个for循环,它不能利用任何优化的代码并且必须被解释,因此通常需要更长的时间来做同样的事情.

以向量(或矩阵)的形式编写代码或转换为该形式的代码称为"向量化".

http://www.gnu.org/software/octave/doc/interpreter/Basic-Vectorization.html

对于第二种情况,你问你应该尝试这样的事情:

  img(img<0) = 0;

  img(img>255) = 255; 
Run Code Online (Sandbox Code Playgroud)

对于第一种情况,这样的事情:

  img(img ~= 255) = 0; 
Run Code Online (Sandbox Code Playgroud)