说我有以下基本的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语句的方法。
实际上,我只想尽快做到这一点。
答案 0 :(得分:6)
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
答案 1 :(得分:4)
B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);
B(A==0) = NaN;
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分: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...