在GNU Octave版本3.4.3中,我无法应用自定义函数来处理矩阵中的每个项目/元素。
我有一个(2,3)矩阵,看起来像:
mymatrix = [1,2,3;4,5,6];
mymatrix
1 2 3
4 5 6
我想使用矩阵的每个元素作为输入,并针对它运行自定义函数,并让函数的输出逐项替换mymatrix的内容。
答案 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)
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)如何应用于矩阵中的每个项目。
下面是从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.m
到job8.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