Как экспоненциальные матрицы в распределенных массивах 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)); 
Другие вопросы по тегам