【问题标题】:Different operations of different elements of a vector向量的不同元素的不同操作
【发布时间】:2018-09-12 21:11:31
【问题描述】:

我有一个具有多个值的列向量,例如 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 中得到了新的向量。我的问题是,有没有另一种更快、更有效的方法来做到这一点而无需循环?因为正如我所说,我最终需要不止一次地做很多列

提前谢谢你

【问题讨论】:

    标签: matlab


    【解决方案1】:

    假设所有值都将减少 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;
    

    【讨论】:

    • 非常感谢。这极大地缩短了运行时间。感激不尽
    【解决方案2】:

    你可以构建一个名为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;
    

    您可以选择方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2022-08-18
      • 2018-02-23
      相关资源
      最近更新 更多