Как экспоненциальные матрицы в распределенных массивах Matlab
Новичок здесь. Я пытаюсь использовать функцию сигмоида в распределенном массиве в Matlab, но я получаю следующую ошибку:
>> a = magic(10);
>> a = distributed(a);
>> a^2
Undefined function 'mpower' for input arguments of type 'distributed'.
Неопределенная функция 'mpower' для входных аргументов типа 'распределенная'.
Я сделал некоторые интернет-исследования, но я действительно не нашел ничего полезного.
Но мне нужно сделать экспоненту на распределенном массиве.
Есть ли способ сделать это?
1 ответ
Вы, вероятно, намеревались сделать
b = a.^2;
вместо
b = a^2;
Без .
, умножение представляет собой "матричное умножение" (на самом деле, название mpower
предполагает, что это буквально возведение в степень матрицы); с .
, это "поэлементное умножение". Я предполагаю, что умножение матриц не работает хорошо (вообще?) Для распределенных матриц - с другой стороны, согласно этой ссылке это фактически происходит неявно без необходимости распределения.
Остается вопрос: вы намеревались умножить матрицу или пошаговое умножение?
РЕДАКТИРОВАТЬ
В комментарии вы указали, что причиной вашего вопроса было то, что вы оценивали функцию:
function g = sigmoid2(z)
g = distributed.zeros(size(z));
%g = arrayfun(@(x) (1 / (1+(exp^-(x)))),z);
for idx = 1: numel(z)
g(idx) = 1 / (1+ (exp(1).^-z(idx)));
end
end
и задавались вопросом, есть ли более быстрый способ сделать это. Действительно, есть. Вместо зацикливания на idx используйте одну матричную операцию
g = 1./(1+exp(-z));
как определение вашей функции - это будет во много раз быстрее. Matlab мощен, но выполнение каждой строки требует много накладных расходов, поэтому избегайте циклов, если можете. Узнайте о векторизации в Matlab (посмотрите). Распределение не всегда ускоряет процесс - оно зависит от операции и размера матриц. Используйте инструмент профилирования, чтобы выяснить, какая линия занимает больше всего времени, а затем используйте эти знания, чтобы сосредоточить свои усилия. Удачи!
Это может быть поздний ответ, но...
Следующее: в порядке исполнения:
Массив - самый медленный
g = arrayfun(@(x) 1/(1+exp(-x)), z);
Далее идет цикл
for idx = 1: numel(z)
g(idx) = 1 / (1+ (exp(1).^-z(idx)));
end
Самым быстрым является точечная запись
g = 1./(1+exp(-z));