【问题标题】:Parallel MATLAB - Create a distributed vector并行 MATLAB - 创建分布式向量
【发布时间】:2014-09-01 19:49:27
【问题描述】:

我在 Matlab 中有一个相对较小的向量

R = randn(1,1000);

现在我想通过选择这样的一组指定元素来创建一个更大的向量

Q = R([1 5 8 5 8 1 3 4 19 1, etc]);

选中元素numel(Q)的数量是1,000,000+,非常大。是否可以执行此步骤以使生成的向量Q 自动成为分布式数组,准备好在多核机器上进行并行处理?

谢谢!

【问题讨论】:

    标签: arrays matlab distributed


    【解决方案1】:

    这里提到的方法假设您希望至少有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,[]));
    

    【讨论】:

    • 不好意思,Q现在分布式数组怎么样了?我需要对其进行进一步的操作,我希望它们在 16 个内核上并行工作
    • @AiridasKorolkovas 如果您只想创建一个分布式向量,那么在您创建一个法线向量 Q - dQ = distributed(Q),其中dQ 代表您的分布式向量之后,这是否可行?
    • 当然可以,但是我觉得直接去分布式版本可以节省一半的处理时间。我正在考虑类似于直接从非零条目构建 sparse() 矩阵的东西,而不是首先创建一个完整的矩阵然后转换为稀疏矩阵。
    • @AiridasKorolkovas 以R = randn(1,N,'distributed'); 开头,即R 是分布式阵列,然后Q 将自动成为分布式阵列。因此,客户端不需要保存任何数据?查看编辑后的代码。另外,鉴于您在问题中遇到的问题,我不确定您为什么需要在这里使用稀疏矩阵。
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多