2014-09-01 56 views
2

我在Matlab一个relativelly小的矢量并行MATLAB - 创建一个分布式的矢量

R = randn(1,1000); 

现在我想通过选择一组指定的元素,像这样

Q = R([1 5 8 5 8 1 3 4 19 1, etc]); 
创造一个更大的载体

选定元素numel(Q)的数量是1,000,000+,非常大。是否有可能执行此步骤,以便生成的向量Q自动成为分布式阵列,可以在多核机器上进行并行处理?

谢谢!

回答

0

这里提到的方法假定您想要至少有RQ作为分布式阵列。

方法#1

该溶液将基于此very smart solution -

N = 3; 
R = randn(1,N,'distributed'); 
[~,ind] = sort(rand(numel(R))); 
Q = R(ind(:)); 

注意,对于上面的代码,ind将是对客户端。如果你想拥有它作为分布式阵列也用这个 -

N = 3; 
R = randn(1,N,'distributed'); 
ind = ones(N,'distributed'); 
[~,ind(:,:)] = sort(rand(numel(R))); 
Q = R(ind(:)) 

输出 -

R = 
    0.3080 0.8227 0.4248 
Q = 
    0.8227 0.3080 0.4248 0.4248 0.8227 0.3080 0.3080 0.4248 0.8227 

在你的情况,N = 1000


方法2

如果你不关心有多少次从R的元素在Q重复的,那么你可以使用这个 -

R = randn(1,N,'distributed'); 
Q = R(reshape(ceil(N*rand(N)),1,[])); 
+0

我对不起,现在Q如何分布式数组?我需要对它做进一步的操作,并且我希望它们在16个内核上并行工作。 – 2014-09-01 20:27:00

+0

@AiridasKorolkovas如果你只想创建一个分布式向量,在创建一个法向量之后这个工作是否会起作用,Q - 'dQ = distributed(Q )',其中'dQ'代表你的分布式矢量? – Divakar 2014-09-01 20:33:59

+0

当然可以,但我认为我可以通过直接转到分布式版本来节省一半的处理时间。我正在考虑类似于直接从非零条目构建稀疏矩阵(),而不是先创建一个完整矩阵,然后转换为稀疏矩阵。 – 2014-09-01 20:40:01