如何在matlab if语句中更新向量的长度

如何在matlab if语句中更新向量的长度,matlab,for-loop,Matlab,For Loop,我正在使用MATLAB编写一个函数,它可以找到向量v中等于标量a的所有元素,并将它们中的每一个更改为[bc],最后返回新的向量w。如果v=[1 2 5],a=2,b=4,c=3,那么结果就是w=[1 4 3 5] 下面是我的代码 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));

我正在使用MATLAB编写一个函数,它可以找到向量v中等于标量
a
的所有元素,并将它们中的每一个更改为
[bc]
,最后返回新的向量w。如果
v=[1 2 5],a=2,b=4,c=3,
那么结果就是
w=[1 4 3 5]

下面是我的代码

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
的长度,这样,如果向量的大小增加,则if语句中的
length(v)
将不会更新,因此
ii
无法覆盖所有元素索引。例如,如果我的输入是
([1 2 2 3 4 5 6 2],2,4,4)
,那么对于我的代码,的
将停止在
ii=10
,这是旧的
v
的长度,并给出错误的结果
[1 4 4 4 4 4 4 4 4 4 5 6 2]
,这不会更改最后一个元素(因为ii不包括15)

我的问题是:如何在
if
语句中更新
length(v)
?或者有没有其他更好的方法来完成这项任务


非常感谢。

我认为如果您使用单元阵列,这将更容易实现

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

与检查循环中的每个元素相比,更简单的方法是使用
find(v==A)
查找新元素的位置,然后在这些情况下循环(注意索引!):


您可以将数值数组转换为单元格数组,并使用
cellfun
更改元素。我相信这样代码会更干净。没有使用
I
作为循环变量的额外积分:)谢谢,伙计!我对如何使用
cellfun
感到困惑,我尝试使用
for
循环来更改单元格中的每个元素。你的代码对我来说是一个很好的教训:)太棒了!我花了10分钟才理解你的代码!特别是为什么在
v(ind-1:end)=[bcv(ind:end-1)]中减去
1
(因为您希望在向量的尾部放置一个
0
)。这真是个好方法!
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