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

Matlab 向量不同元素的不同运算,matlab,Matlab,我有一个列向量有多个值,例如100。我还有一个向量和一些索引,但它们是数字而不是逻辑值(我从另一个计算中得到)。假设值为13,44,77。现在我想把这些指数的三个值增加10%,其他的都减少10%。 最终,我将使用循环连续增加/减少上一个向量的值,但目前我们只能说我只做了一次。 我已经这样做了,但是通过如下的for循环:(我的原始向量是T,索引向量是a) 这样我就得到了p中的新向量。我的问题是,有没有另一种更快更有效的方法来实现这一点而不需要循环?因为正如我所说的,我最终需要做这件事,很多专栏,而

我有一个列向量有多个值,例如100。我还有一个向量和一些索引,但它们是数字而不是逻辑值(我从另一个计算中得到)。假设值为13,44,77。现在我想把这些指数的三个值增加10%,其他的都减少10%。 最终,我将使用循环连续增加/减少上一个向量的值,但目前我们只能说我只做了一次。 我已经这样做了,但是通过如下的for循环:(我的原始向量是T,索引向量是a)

这样我就得到了p中的新向量。我的问题是,有没有另一种更快更有效的方法来实现这一点而不需要循环?因为正如我所说的,我最终需要做这件事,很多专栏,而不仅仅是一次


提前感谢

假设所有值都将减少10%,然后用增加10%的原始T值覆盖所需索引处的值:

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;

假设所有值将减少10%,然后用增加10%的原始T值覆盖所需索引处的值:

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;

您可以构建一个名为
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种方法,结果显示覆盖速度最快,arrayfun最后在for循环中排名第二:

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;

您可以根据自己的方便进行选择。

您可以构建一个名为
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种方法,结果显示覆盖速度最快,arrayfun最后在for循环中排名第二:

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;

为了您的方便,您可以选择。

非常感谢。这大大缩短了运行时间。太感谢你了,太感谢你了。这大大缩短了运行时间。非常感谢你