如何在matlab if语句中更新向量的长度
我正在使用MATLAB编写一个函数,它可以找到向量v中等于标量如何在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));
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