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は存在しませんが、いくつかのオプションがあります。すべてまたはいずれかの要素が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
于 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

一般に、行列のいくつかの要素に対して 1 つの操作を実行し、残りの要素に対して別の操作を実行するには、1 行のソリューションは次のとおりです。

Z = B .* X + ~B .* Y;

ここで、B は論理行列です。例として、

Z = (A == 0) .* -1 + (A ~= 0) .* A;

A をコピーしますが、A が 0 であるすべての場所に -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

あなたがする必要があるのは、あなたが操作したい要素を特定することです。私は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 に答える
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 に答える