假设我有以下基本的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语句。
实际上,我只是希望尽可能快地完成这项任务。
假设我有以下基本的if语句:
if (A ~= 0)
% do something like divide your favorite number by A
else
% do something like return NaN or infinity
end
矢量化的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 = zeros(size(A));
B(A~=0) = FAV./A(A~=0);
B(A==0) = NaN;
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
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...
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