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 返回 true。我正在寻找的是矢量化的?为 A 中的每个元素执行上述 if 语句的方法。

实际上,我只是想尽可能快地做到这一点。

4

5 回答 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
于 2009-05-07T15:07:40.177 回答
4
B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);  
B(A==0) = NaN;
于 2009-05-08T14:27:03.300 回答
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
于 2009-05-08T16:09:08.220 回答
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
于 2009-05-07T14:58:08.780 回答
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...
于 2009-05-07T15:07:36.650 回答