使用matlab用if操作替换矩阵的值

时间:2016-02-26 08:24:37

标签: matlab if-statement cell

mn = 1 
for kn = 1:199 
  for sn = 1:19773 
      if abs((x1c{kn+1,1}(sn)) - (x1c{kn,1}(sn))) >= 20 
          extract{mn} = x1c{kn+1,1}(sn); 
          mn = mn+1;
      end
   end
end
extend = cell2mat(extract) + 40;

如何使用“extend”的值更改“x1c”的值?

1 个答案:

答案 0 :(得分:0)

您正在对单元格执行操作。考虑到你在比较数字时,在使用矩阵时,这将更有效地完成。

我因此建议您将单元格(或其子集)转换为矩阵,然后使用矢量化操作,如下所示:

>> a={[13, 2, 3], [14, 25, 8], [100, 9, 10], [101, 8, 32], [140, 20, 3]};
>> 
>> x = transpose(reshape(cell2mat(a), 3, []));
>> z = abs(x(2:end, :) - x(1:end-1,:)) > 20;
>> z2 = [zeros(1,3); z]

z2 =

     0     0     0
     0     1     0
     1     0     0
     0     0     1
     1     0     1

>> x(logical(z2)) = x(logical(z2)) - 200

x =

    13     2     3
    14  -175     8
  -100     9    10
   101     8  -168
   -60    20  -197

如果你真的必须使用细胞,有两种选择(出于速度原因我不推荐它)。

  1. 存储您的条件成立的单元格项目的索引k, sn)。然后你必须再次循环元素(非常低效)。

  2. 您存储上一个和下一个单元格" row"在临时变量中并使用它们进行比较。当条件成立时,就地编辑并在循环的下一次迭代中随身携带临时变量。下面的代码显示了如何完成此操作:

    a={[13, 2, 3], [14, 25, 8], [100, 9, 10], [101, 8, 32], [140, 20, 3]};
    
    curr_row = a{1};
    for rowind=1:4
        next_row = a{rowind+1};
        for colind=1:3
            if abs(next_row(1, colind) - curr_row(1, colind)) > 20
                a{rowind+1}(1, colind) = a{rowind+1}(1, colind) + 40;
            end
        end
        curr_row = next_row;
    end