المؤسسة الدولية للعلوم Elementwise في MATLAB - أنها لا وجود لها؟

StackOverflow https://stackoverflow.com/questions/835142

سؤال

ويقول لدي الأساسية التالية إذا-بيان:

if (A ~= 0)
   % do something like divide your favorite number by A
else
   % do something like return NaN or infinity
end

والمشكلة هي أن ليس هناك عدد بسيط ولكنه متجه. يعود ماتلاب صحيح إذا لم يكن عنصر في (أ) هو 0. ماذا أنا تبحث عن vectorized؟ طريقة perforimg للبيان إذا أعلاه لكل عنصر في A.

في الواقع، أنا ببساطة تريد أن تفعل ذلك في أسرع وقت ممكن.

هل كانت مفيدة؟

المحلول

B = zeros(size(A));
B(A~=0) = FAV./A(A~=0);  
B(A==0) = NaN;

نصائح أخرى

والمؤسسة الدولية للعلوم Vectorized لا وجود لها، ولكن هناك بعض الخيارات. إذا كنت ترغب في اختبار للجميع أو أي عناصر حقيقية، استخدام كل أو أي وظيفة.

وهنا مثال واحد من القيم تعديل مشروط مصفوفة:

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

وبشكل عام، لتنفيذ عملية واحدة على بعض عناصر مصفوفة وعملية أخرى على العناصر المتبقية، وهو حل من سطر واحد هو:

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

وحيث B هو مصفوفة منطقية. على سبيل المثال،

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

ونسخ ولكن يعين -1 في كل مكان أن (أ) هو صفر.

ولكن، وبسبب الصفقات السؤال مع ما لا نهاية أو NaNs ل، فإنه يمكن القيام به حتى أكثر وضوحا:

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

وأو عن سفينة واحدة، يمكنك استخدام مشروطة في مكان indicies

y = x./A(A~=0); % divides x by all non-zero elements of A

ما عليك القيام به هو تحديد العناصر التي تريد أن تعمل على. وأود أن استخدام FIND. I تخزين النتائج في VI (Indicies صالح) واستخدام ذلك لتجميع مصفوفة.

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...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top