2016-02-29 24 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'循环来更改单元格中的每个元素。你的代码对我来说是一个很好的教训:) –