在Matlab中将数组元素分配给不同的变量

9vw9lbht  于 2022-11-24  发布在  Matlab
关注(0)|答案(2)|浏览(222)

我在Matlab代码中看到了很多次等价运算,我想,一定有一种方法可以压缩这些运算,然后一次完成。在这个例子中,它检查了一些变量是否小于某个epsilon:

if abs(beta) < tol
    beta = 0;
end
if abs(alpha) < tol
    alpha = 0;
end
if abs(gamma) < tol
    gamma = 0;
end

我试着把这些组合成几行来处理整个战利品,

overTol = [alpha,beta,gamma] >= tol;
[alpha,beta,gamma] = [alpha,beta,gamma] .* overTol;

如果这是Python,列表就是列表就是列表,这没问题,但在Matlab中,右边的操作会在左边产生一个变量,除非特殊情况。
在阅读Define multiple variables at the same time in MATLAB?Declare & initialize variables in one line in MATLAB without using an array or vector之后,我尝试使用deal,但是[alpha,beta,gamma] = deal([alpha,beta,gamma] .* overTol);并没有在左边的向量项之间分配给deal函数的向量项,而是将整个向量的副本分配给每个项。
我最不想做的就是把右向量设为一个唯一的向量,然后把α,β,γ,一个接一个地设为这个向量的项,这和我刚开始做的一样难看。
有没有一个优雅的解决方案?

lvmkulzt

lvmkulzt1#

好吧,评论解释了为什么可能有更好的方法。我很好奇,如果它可以做到。它可以,但也许它不应该。

% Initial values
a = 0.01; b = 0.1; c = 1; 
% Tolerance
tol = 0.05;
% Function - note returns a scalar cell
f = @(f) {f.*(abs(f)>tol)}
% arrayfun returns a cell of the new values
% cell2struct turns that into a struct array with a single field 'f'
% the trailing dot-reference extracts that field and builds a 
% comma-separated list which can be used to assign the new values
[a2,b2,c2] =  cell2struct(arrayfun(f, [a,b,c]),{'f'}).f
ncgqoxb0

ncgqoxb02#

您可以使用cellfun生成结果的单元格数组,并使用deal将其重新分配回变量

f = @(x) x.*(abs(x)>tol);             % function which returns x, or x if abs(x)<tol
d = cellfun( f, {a,b,c}, 'uni', 0 );  % apply function to inputs a,b,c
[a,b,c] = deal(d{:});                 % deal results back to a,b,c

一个更易读(和维护友好)的方法可能是只使用函数,并接受它将使用更多的行。

a = applyTol(a);
b = applyTol(b);
c = applyTol(c);

function x = applyTol( x )
    tol = 0.5;
    if abs(x) < tol
        x = 0;
    end
end

相关问题