Matlab中的逐元素if语句——它们是否存在?

3

假设我有以下基本的if语句:

if (A ~= 0)
   % do something like divide your favorite number by A
else
   % do something like return NaN or infinity
end

问题在于A不是一个简单的数字,而是一个向量。如果A中没有任何一个元素为0,Matlab会返回真值。我正在寻找一种矢量化的方法来对A中的每个元素执行上述if语句。
实际上,我只是希望尽可能快地完成这项任务。

我想你的意思是如果(A ~= 0) - MatlabDoug
5个回答

6

矢量化的if语句不存在,但有一些替代方案。如果您想要测试所有或任何元素是否为真,请使用all或any函数。

以下是一个条件修改矩阵值的示例:

b = A ~= 0;      % b is a boolean matrix pointing to nonzero indices
                 % (b could be derived from some other condition,
                 %  like b = sin(A)>0
A(b) = f(A(b))   % do something with the indices that pass
A(~b) = g(A(~b)) % do something else with the indices that fail

直到你指出来,我才意识到b(布尔矩阵)的存在。谢谢! - AnnaR

4
B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);  
B(A==0) = NaN;

1
通常,要在矩阵的某些元素上执行一种操作,在其余元素上执行另一种操作,可以使用一行代码解决:
Z = B .* X + ~B .* Y;

B是一个逻辑矩阵。例如,

Z = (A == 0) .* -1 + (A ~= 0) .* A;

复制A,但在A为零的地方全部赋值为-1。

然而,由于该问题涉及无穷大或NaN,可以更简洁地完成:

Z = FAV ./ A; % produces inf where A == 0
Z = (A ~= 0) .* FAV ./ A; % produces NaN where A == 0

0
你需要做的是确定你想要操作的元素。我会使用FIND函数。我将结果存储在VI(有效索引)中,并使用它来填充矩阵。
clear
clc

den = [2 0 2; 0 2 0; -2 -2 -2]
num = ones(size(den));
frac = nan(size(den));

vi = (den ~=0)

frac(vi) = num(vi)./den(vi)

vi = (den == 0)

frac(vi) = nan %just for good measure...

1
FYI:你不需要使用find函数,可以直接使用布尔矩阵。find函数的作用是提取特定索引值,并且在只有少数值为真时节省内存空间。 - Jason S
已按JASON S的要求删除了FIND。 - MatlabDoug

0
你正在寻找所有非零元素吗?有几种方法可以做到这一点。
nonzero = find(A); % returns indicies to all non-zero elements of A
y = x./A(nonzero); % divides x by all non-zero elements of A
                   % y will be the same size as nonzero

或者你可以使用条件语句代替索引来实现一行代码。

y = x./A(A~=0); % divides x by all non-zero elements of A

如果A中有任何元素为零,该语句会导致y比A短,这可能是想要的也可能不是。 - Mark Ruzon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接