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))在矩阵/向量的每个元素上运行函数.
frh*_*ack 20
或者,您可以使用以下元素方式运算符(请注意点前缀):
例如
mymatrix = 1 ./ (1 .+ e.^(-mymatrix));
Run Code Online (Sandbox Code Playgroud)
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)应用于矩阵中的每个项目.
下面是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不等于金属上的多线程.
更简单的方法,正如纳赛尔指出的,以下八度代码:
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)