在Matlab中更有效地循环矩阵元素

Fak*_*DIY 3 matlab loops matrix

我正在写一些matlab代码并编写了一个有效的算法,但我认为它不是特别有效.由于我正在努力提高我的编程技巧,我想知道是否有更有效的方法来做到这一点.

我有一个(相当大的~E07)值矩阵,它们是无序的,但是在[-100,100]范围内.我想通过使用以下规则创建基于第一个矩阵的第二个矩阵:

  1. 如果该点的值> 70,则该点的值应设置为70.
  2. 如果该点的值小于-70,则该点的值应设置为-70.
  3. 所有其他值应四舍五入到最接近的5的倍数.

这是我目前正在做的事情:

data = 100*(-1+2*rand(1,10000000)); % create random dataset for stackoverflow
new_data = zeros(1,length(data));

for i = 1:length(data)
    if (data(i) > 70)
        new_data(i) = 70;
    elseif (data(i) < -70)
        new_data(i) = -70;
    else
        new_data(i) = round(data(i)/5.0)*5.0;
    end
end
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?我认为应该有一种方法可以使用逻辑索引来做到这一点,但这些对我来说是一个新的发现......

H.M*_*ter 8

你根本不需要循环:

data = 100*(-1+2*rand(1,10000000)); % create random dataset for stackoverflow
new_data = zeros(1,length(data)); % note that this memory allocation is not necessary at this point

new_data = round(data/5.0)*5.0;
new_data(data>70) = 70;    
new_data(data<-70) = -70;
Run Code Online (Sandbox Code Playgroud)


小智 5

更容易使用max和min.用一个简单的方法做.

new_data = round(5*max(-70,min(70,data)))/5;
Run Code Online (Sandbox Code Playgroud)