访问MATLAB中的条目列表

时间:2015-11-02 13:46:50

标签: matlab matrix indexing

我有一个巨大的矩阵MxN矩阵,比如A=rand([M,N]);和一个N1之间M整数值的索引向量,比如{ {1}}。

现在我想生成一个带有条目

的行向量
RandomIndex = randi(M,[1,N]);

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

目前最快的选择是

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

有更有效的方法吗?

4 个答案:

答案 0 :(得分:5)

使用sub2ind

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

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

另一种方法是使用1:NNxN返回diag(A(RandomIndex, 1:N)).' 矩阵,然后使用diag

的对角线
.'

注意 SQL> @test asdf old 4: l := '&1'; new 4: l := 'asdf'; Recieved: asdf PL/SQL procedure successfully completed. SQL> @test as df old 4: l := '&1'; new 4: l := 'as'; Recieved: as PL/SQL procedure successfully completed. SQL> @test "as df" old 4: l := '&1'; new 4: l := 'as df'; Recieved: as df PL/SQL procedure successfully completed. SQL> 用于将diag返回的行向量转换为列向量。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

直接使用您的索引。

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);