向量的不同元素的不同运算

时间:2018-09-12 21:11:32

标签: matlab

我有一个具有多个值(例如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中获得新的向量。我的问题是,还有另一种更快,更有效的方式来执行此操作而不循环吗?因为正如我所说,我最终将不仅需要一次完成很多列工作

提前谢谢

2 个答案:

答案 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;

为了方便您可以选择。