2016-02-29 246 views
2

我正在使用MATLAB編寫一個函數,它可以找到矢量v中的所有元素等於標量a,並將它們中的每一個都更改爲[b c],最後返回新的向量w。如果v = [1 2 5], a = 2, b = 4, c = 3,那麼結果是w = [1 4 3 5]如何更新matlab中的矢量的長度如果語句

下面是我的代碼

function w = change(v, a , b ,c) 


for ii = 1:length(v) 
    if v(ii) == a 
     v_1 = v(1:ii-1); 
     v_2 = v(ii+1:length(v)); 
     v_3 = [b c]; 
     v = [v_1 v_3 v_2]; 
    end 
end 


w = v; 

end 

然而,問題是:for聲明只會循環的第一次運行前閱讀v的長度,這樣,如果載體的大小增加,那麼length(v)中if語句不會被更新,因此ii不能覆蓋所有的元素索引。例如,如果我的輸入是([1 2 2 2 3 2 4 5 6 2], 2, 4, 4),那麼使用我的代碼,for將在ii = 10處停止,這是舊的v的長度,並給出錯誤的結果[1 4 4 4 4 4 4 3 4 4 4 5 6 2],它不會更改最後一個元素(因爲ii不包含15 )。

我的問題是:如何在if聲明中更新length(v)?或者還有其他更好的方法來完成這項任務嗎?

非常感謝。

+1

您可以將數字數組轉換爲單元格數組,並使用'cellfun'來更改元素。我相信代碼將會更加清潔。 –

+0

不使用'i'作爲循環變量的積分:) –

回答

1

比在一個循環檢查每一個元素簡單的方法是尋找到新的元素會去,通過使用find(v==a),只是環上的情況下(注意與索引!):

s = find(v==a); 
v(end+1:end+numel(s))=0; 
for ii=1:numel(s) 
    ind=s(ii)+ii; 
    v(ind-1:end)=[b c v(ind:end-1)]; 
end 
+0

令人驚歎!我花了10分鐘才明白你的代碼!特別是爲什麼在'v(ind-1:end)= [b c v(ind:end-1)];'(因爲你想在vector的尾部放一個'0')減去'1'。這真是一個很好的方法! –

2

我認爲如果用細胞陣列做這件事情會更容易。

function w = change(v, a , b ,c) 
    cellV = num2cell(v); 
    cellW = cellfun(@(x)(subFunction(x,a,b,c)),cellV,'uni',0); 
    w = [cellW{:}]; 
end 

function out = subFunction(val,a,b,c) 
    if (val == a) 
     out = [b c]; 
    else 
     out = x; 
    end 
end 
+0

感謝好友!我對如何使用'cellfun'感到困惑,我試圖使用'for'循環來更改單元格中的每個元素。你的代碼對我來說是一個很好的教訓:) –