GNU Octave方法对矩阵中的每个项目进行操作.八度"arrayfun(...)"的例子

Eri*_*ski 36 linux function octave

在GNU Octave版本3.4.3中,我无法应用自定义函数来操作矩阵中的每个项目/元素.

我有一个(2,3)矩阵,看起来像:

mymatrix = [1,2,3;4,5,6];

mymatrix

   1   2   3
   4   5   6
Run Code Online (Sandbox Code Playgroud)

我想使用矩阵的每个元素作为输入,并对它运行自定义函数,并让函数的输出逐项替换mymatrix的内容.

Nik*_* G. 65

arrayfun适用于此:

arrayfun(@(x) 1/(1+e^(-x)), [0, 1; 2, 3])
Run Code Online (Sandbox Code Playgroud)

输出:

ans =

   0.50000   0.73106
   0.88080   0.95257
Run Code Online (Sandbox Code Playgroud)

这基本上1/(1+e^(-x))在矩阵/向量的每个元素上运行函数.

  • 我发现有点容易实现```func = @(x)(1 ./(1.+ e.^( - x))); g = func(z); ``` (11认同)
  • @SochiX或者如果你想避免编写匿名函数:`g =(1 ./(1.+ e.^( - z)))` (3认同)
  • 如果使用 Octave 或其他类似 Matlab 的工具,您不需要使用逐元素表示法进行加法,因为加法默认适用于所有元素,因此 g = 1 ./ (1 + e.^(-z)) 应该可以工作 (3认同)
  • 您给了我确切的答案,以帮助我解决自己的课程。我觉得我现在被骗了。 (2认同)

frh*_*ack 20

或者,您可以使用以下元素方式运算符(请注意点前缀):

  • .+
  • .-
  • ./
  • 即^

例如

mymatrix = 1 ./ (1 .+ e.^(-mymatrix));
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 7

将此代码放在名为"myfun.m"的文件名中

function [ out ] = myfun(num)
  out = num + 5;
end
Run Code Online (Sandbox Code Playgroud)

将此代码放在名为"main.m"的文件名中

arrayfun(@myfun, [1, 0, -1; 3, 4, 5] )
Run Code Online (Sandbox Code Playgroud)

输出:

ans =
   6   5   4
   8   9   10
Run Code Online (Sandbox Code Playgroud)

注意如何将过程(添加5)应用于矩阵中的每个项目.

PROTIP:为什么这个代码在足够大的矩阵上不会最大化你的四核CPU.

下面是arrayfun从Vectorization向下到低级别C的角度分析其功能.直接在裸机上进行多核和多线程优化:

这段arrayfun代码是"矢量化的",GNU Octave将这些代码打包成预先优化的C代码,而不是让GNU Octave管理自己的冰川迭代.以上述向量化方式执行的操作比将其置于for循环中快2到5个数量级.像这样的矢量化代码对于典型的任务来说通常是足够好的,但是如果从Alienware的QUAD-CHIP 32核超线程CPU中提取每一马力的动力是关键任务,请继续阅读.

不要误以为这个代码是"多线程"或"多核",因为它不是.C代码仍然以迭代的先进先出队列方式处理此代码.第4个加法必须等到第3个,第3个必须等待第2个.在此迭代发生时,您的CPU正在摆弄它的拇指.如果您希望桌面下的16核CPU在执行此操作时将CPU使用率最大化为100%,那么就无法逃脱:您必须在多线程和多核导向中停止并重新定义此问题办法.多线程和多核超出了这个答案的范围,最简单的方法是定义你的八度代码,job1.m通过job8.m同时运行的文件生成8个独立的并行文件,让它们全部处理任务的1/8在手边,最后等待所有人完成然后重新加入答案.这里的GNU Octave Vectorization不等于金属上的多线程.


Eri*_*ski 1

更简单的方法,正如纳赛尔指出的,以下八度代码:

f=@(x) x+5;
A = [1, 0, -1; 3, 4, 5];
result = f(A)
result
Run Code Online (Sandbox Code Playgroud)

将 (x+5) 应用于传入的每个元素,它会打印:

result =
    6    5    4
    8    9   10
Run Code Online (Sandbox Code Playgroud)

  • 这个例子是正确的,但之所以有效,是因为您向矩阵添加了一个标量,即使不应用函数,它也可以工作,但只需作为“A+5”即可。但它不一定适用于更复杂的函数,其中包括取元素的负幂等。请参阅我的[下面的答案](http://stackoverflow.com/a/26415689/182371),了解如何编写该函数的示例更复杂的场景。 (9认同)