【问题标题】:Access a list of entries in MATLAB访问 MATLAB 中的条目列表
【发布时间】:2015-11-02 13:46:50
【问题描述】:

我有一个巨大的矩阵MxN 矩阵,比如A=rand([M,N]); 和一个索引向量,其N 整数值介于1M 之间,比如RandomIndex = randi(M,[1,N]);

现在我想生成一个带有条目的行向量

result = [A(RandomIndex(1),1), A(RandomIndex(2),2), ..., A(RandomIndex(N),N)]

什么是执行此操作的有效方法?这应该是一个非常便宜的操作,但我所有的实现都很慢。我不认为 Matlab 中有一个符号可以直接执行此操作,是吗?

目前最快的选择是

indexFunction = @(r,c) A(r,c);
result = cell2mat(arrayfun(indexFunction,RandomIndex,1:N,'UniformOutput',false));

有没有更有效的方法?

【问题讨论】:

    标签: matlab matrix indexing


    【解决方案1】:

    使用sub2ind

    A(sub2ind(size(A), RandomIndex, 1:N))
    

    sub2ind 会将RandomIndex1:N 给出的行和列索引转换为基于size(A) 的线性索引,然后您可以使用它直接索引A


    另一种方法是使用RandomIndex1:N 返回一个NxN 矩阵,然后用diag 取其对角线

    diag(A(RandomIndex, 1:N)).'
    

    注意.'用于将diag返回的行向量转换为列向量。

    【讨论】:

    • 加 1 是该问题的第一个正确答案。
    • 事实证明,为这种特殊情况手动复制 sub2ind 甚至更快,即A(M*(0:(N-1)) + RandomIndex)
    【解决方案2】:
    M=10;N=50;
    A=rand([M,N]);
    RandomIndex = randi(M,[1,N]);
    out = zeros(1,numel(RandomIndex));
    for ii = 1:numel(RandomIndex)
        out(ii)=A(RandomIndex(ii),ii);
    end
    

    【讨论】:

    • 这不会产生正确的值。您的代码生成A(RandomIndex, 1)
    • 愚蠢的 MATLAB 没有达到我的预期......好吧,然后它又回到了可靠的 for 循环
    • 这也是正确的。最规范的方式来做到这一点。 +1。
    【解决方案3】:

    另一种方法是使用sparse 和逻辑索引:

    M = sparse(RandomIndex, 1:N, 1) == 1;
    out = A(M);
    

    第一行代码生成一个逻辑矩阵,其中每列中只设置了 1 个true 值。这是由RandomIndex 的每个值定义的。我们将其转换为logical 矩阵,然后索引到您的矩阵以获得最终的随机向量。

    【讨论】:

      【解决方案4】:

      直接使用您的索引。

      M = 100;N=100;
      A = rand(M,N);
      % get a random index that can be as large as your matrix
      % 10 rows by 1 column
      idx = randi(numel(A), 10,1);
      t = A(idx);
      

      【讨论】:

      • 这不会产生正确的值。您的代码生成A(RandomIndex, 1)
      • @IKavanagh 它肯定不会产生A(RandomIndex,1)。首先没有RandomIndex 这么好的尝试。其次,没有理由将其限制为A(<any number>, 1),因为它使用A 中所有条目的随机索引。如果您费心运行代码,您会看到 idx(1) = 8148 是元素 A(82,48) 。但是,嘿...为什么要打扰...只是巨魔...
      • 这不会产生 OP 正在寻找的东西。从他的提问中可以看得很清楚。他有A,他有RandomIndex,如果他将RandomIndex应用于A,就像你的问题一样t = A(RandomIndex);,它会产生A(RandomIndex, 1),就像我的评论一样。 idx(1) = 8148A(82,48) 与问题有何关联?
      • @IKavanagh 是正确的。问题是要求生成随机行位置,但列位置是预定义的顺序:col = 1, 2, ..., N。本质上,OP 想要生成:A(random_number_1, 1), A(random_number_2, 2), ..., A(random_number_N, N)。此代码不执行 OP 的要求。主要是它不保证列访问是 OP 要求的方式。您正在生成列主要索引,这很好,但它并没有按照正确的顺序进行。
      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 2014-10-22
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 2013-05-07
      相关资源
      最近更新 更多