Вопрос

Скажем, у меня есть следующее основное выражение if:

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

Проблема в том, что A - не простое число, а вектор. Matlab возвращает true, если ни один элемент в A не равен 0. Что я ищу, так это векторизация? способ выполнения оператора if выше для каждого элемента в A.

На самом деле, я просто хочу сделать это как можно быстрее.

Это было полезно?

Решение

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

Другие советы

Векторизация, если не существует, но есть несколько вариантов. Если вы хотите проверить все или любые элементы на true, используйте функцию 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

Как правило, для выполнения одной операции над некоторыми элементами матрицы и другой операции над оставшимися элементами решение в одну строку:

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

где B - логическая матрица. Как пример,

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

копирует A, но присваивает -1 везде, где A равно нулю.

Однако, поскольку вопрос касается бесконечности или 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 (Valid 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