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