我有一个巨大的矩阵MxN
矩阵,比如A=rand([M,N]);
和一个N
和1
之间M
整数值的索引向量,比如{ {1}}。
现在我想生成一个带有条目
的行向量RandomIndex = randi(M,[1,N]);
这样做的有效方法是什么?它应该是一个非常便宜的操作,但我的所有实现都很慢。我不认为Matlab中有一个符号可以直接执行此操作,是吗?
目前最快的选择是
result = [A(RandomIndex(1),1), A(RandomIndex(2),2), ..., A(RandomIndex(N),N)]
有更有效的方法吗?
答案 0 :(得分:5)
使用sub2ind
A(sub2ind(size(A), RandomIndex, 1:N))
sub2ind
会将RandomIndex
和1:N
给出的行索引和列索引转换为基于size(A)
的线性索引,然后您可以使用A
索引RandomIndex
直接
另一种方法是使用1:N
和NxN
返回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);