我有一个具有多个值(例如100)的列向量。我也有一个带有一些索引的向量,但它们是数字而不是逻辑值(我从另一计算中获得了它们)。假设值为13,44,77。现在,我想将这些索引的三个值增加10%,将其他所有值减少10%。 最终,我将使用循环依次增加/减少前一个向量的值,但暂时让我只做一次。 我已经做到了,但是通过如下的for循环:(我的原始向量是T,索引向量是A)
P=[];
for k = 1:size(T,1)
if ismember(k,A)
q=T(k).*1.1;
else
q=T(k).*0.9;
end
P=[P;q];
end
通过这种方式,我可以在P中获得新的向量。我的问题是,还有另一种更快,更有效的方式来执行此操作而不循环吗?因为正如我所说,我最终将不仅需要一次完成很多列工作
提前谢谢
答案 0 :(得分:3)
假设所有值都将减少10%,然后以原始T值增加10%覆盖所需索引处的值:
P = T * 0.9;
P(A) = T(A) * 1.1;
或者,(特别是如果要在多个列上使用相同的索引)创建一个值向量,以与原始向量相乘:
F = ones(size(T,1), 1) * 0.9;
F(A) = 1.1;
P = T .* F;
答案 1 :(得分:0)
您不仅可以这次构建一个名为ifelse
的函数,而且可以在我认为的许多场合使用。
function result = ifelse(condition, trueResult, falseResult)
%IFELSE input condition, ifture returns trueResult, vice versa
narginchk(3,3); % check correct number of input args, min = 3, max = 3
if condition
result = trueResult;
else
result = falseResult;
end
根据上面@beaker的回答,我比较了这3种方法,结果表明覆盖是最快的,最后是for循环的arrayfun:
T = (1:90)';
A = [3;4;7;18;22;39;46;55;81];
% first method:using ifelse
P1 = arrayfun(@(x, y, z) ifelse(x, y, z), (ismember(1:size(T), A))', T * 1.1, T * 0.9);
% second: using for loop
P2=[];
for k = 1:size(T,1)
if ismember(k,A)
q=T(k).*1.1;
else
q=T(k).*0.9;
end
P2=[P2;q];
end
% third and fastest one: assining and overwriting
P3 = T * 0.9;
P3(A) = T(A) * 1.1;
为了方便您可以选择。