我编写了一个函数,该函数作用于输入矩阵中列的每个组合。它使用多个for循环,并且速度很慢,因此我试图对其进行并行化处理,以使用计算机上的最大线程数。
我很难找到正确的语法来进行设置。我正在使用倍频程中的Parallel软件包,并尝试了几种设置呼叫的方法。这里有两个,以简化的形式,以及我认为可行的非并行版本:
function A = parallelExample(M)
pkg load parallel;
# Get total count of columns
ct = columns(M);
# Generate column pairs
I = nchoosek([1:ct],2);
ops = rows(I);
slice = ones(1, ops);
Ic = mat2cell(I, slice, 2);
## # Non-parallel
## A = zeros(1, ops);
## for i = 1:ops
## A(i) = cmbtest(Ic{i}, M);
## endfor
# Parallelized call v1
A = parcellfun(nproc, @cmbtest, Ic, {M});
## # Parallelized call v2
## afun = @(x) cmbtest(x, M);
## A = parcellfun(nproc, afun, Ic);
endfunction
# function to apply
function P = cmbtest(indices, matrix)
colset = matrix(:,indices);
product = colset(:,1) .* colset(:,2);
P = sum(product);
endfunction
对于这两个示例,我都会生成两列的每种组合,并将这些对转换为parcellfun函数应拆分的单元格数组。在第一个示例中,我尝试将输入矩阵M转换为1x1的单元数组,以便以相同的形式进入每个并行实例。我收到错误消息“ C必须是一个单元格数组”,但这必须在parcellfun函数内部。在第二篇文章中,我尝试定义一个包含矩阵的匿名函数。我在这里得到的错误表明'cmbtest'未定义。
(自然,我要应用的实际功能比这里的cmbtest复杂得多)
我尝试过的其他方法:
目前我还没有想法,可以使用帮助弄清楚如何使其起作用。
将上面的评论转换为答案。