2016-02-26 75 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