2016-02-26 221 views
0
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”的值?使用matlab替换矩阵的值,如果使用if操作

+0

你所说的“改变价值观”呢?请修复您的缩进,这会让我的眼睛流血。 – dasdingonesin

+0

我想改变“x1c”单元格的特定元素,这个单元格已经被提取了一个if操作,其值为“extend”。这可能是“换镜片”的时候了。 – matlabcrz

+0

我不知道你的意思。你想把'extend'的内容分配给'x1c'吗?哪些特定元素? – dasdingonesin

回答

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. 您可以将上一个和下一个单元格“行”存储在临时变量中,并使用这些变量进行比较。当条件成立时,就地编辑并在循环的下一次循环中随身携带临时变量。下面的代码显示如何做到这一点:

    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