说我有以下基本的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返回true。我要找的是向量化的吗?对A中每个元素执行上述if语句的方法。

实际上,我只想尽快做到这一点。

有帮助吗?

解决方案

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

其他提示

Vectorized ifs不存在,但有一些选项。如果要测试所有或任何元素为true,请使用全部或任何函数。

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

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

通常,要对矩阵的某些元素执行一个操作而对其余元素执行另一个操作,单行解决方案是:

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

您在寻找所有非零元素吗?你可以通过几种方式做到这一点。

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

您需要做的是确定您要操作的元素。我会用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...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top