matlabのelementwise ifs-それらは存在しますか?
-
08-07-2019 - |
質問
次の基本的な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;
他のヒント
ベクトル化されたifは存在しませんが、いくつかのオプションがあります。すべてまたはいずれかの要素がtrueかどうかをテストする場合は、allまたはany関数を使用します。
マトリックスの値を条件付きで変更する1つの例を次に示します。
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つの操作を実行し、残りの要素に対して別の操作を実行する場合、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
すべての非ゼロ要素を探していますか?これにはいくつかの方法があります。
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...
所属していません StackOverflow