0

新手来了 我试图在 matlab 的分布式数组中使用 sigmoid 函数,但出现以下错误:

>> a = magic(10);
>> a = distributed(a);
>> a^2
Undefined function 'mpower' for input arguments of type 'distributed'.

“分布式”类型的输入参数的未定义函数“mpower”。

我做了一些互联网研究,但我真的没有发现任何有用的东西。

但我需要在分布式阵列上做一个指数。

有没有办法做到这一点?

4

2 回答 2

3

你可能打算做

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 中的矢量化(查找)。分发并不总能加快速度——这取决于矩阵的操作和大小。使用分析工具找出哪条线路花费的时间最多 - 然后使用这些知识来集中精力加快速度。祝你好运!

于 2013-06-11T04:04:33.463 回答
1

这可能是一个迟到的答案,但......

如下:按性能排序:

arrayfun 是最慢的

g = arrayfun(@(x) 1/(1+exp(-x)), z);

接下来是for循环

for idx = 1: numel(z) 
    g(idx) = 1 / (1+ (exp(1).^-z(idx))); 
end 

最快的是点符号

g = 1./(1+exp(-z)); 
于 2018-12-22T19:12:47.660 回答