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

时间:2012-07-08 21:27:24

标签: linux function octave

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

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

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

mymatrix

   1   2   3
   4   5   6

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

4 个答案:

答案 0 :(得分:62)

arrayfun适用于此:

arrayfun(@(x) 1/(1+e^(-x)), [0, 1; 2, 3])

输出:

ans =

   0.50000   0.73106
   0.88080   0.95257

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

答案 1 :(得分:15)

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

  • +
  • .-
  • ./
  • 即^

例如

mymatrix = 1 ./ (1 .+ e.^(-mymatrix));

答案 2 :(得分:7)

将此代码放在名为" myfun.m"

的文件名中
function [ out ] = myfun(num)
  out = num + 5;
end

将此代码放在名为" main.m"

的文件名中
arrayfun(@myfun, [1, 0, -1; 3, 4, 5] )

输出:

ans =
   6   5   4
   8   9   10

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

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

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

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

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

答案 3 :(得分:2)

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

f=@(x) x+5;
A = [1, 0, -1; 3, 4, 5];
result = f(A)
result

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

result =
    6    5    4
    8    9   10