访问MATLAB中的条目列表

访问MATLAB中的条目列表,matlab,matrix,indexing,Matlab,Matrix,Indexing,我有一个巨大的矩阵,比如说,a=rand([M,N])和一个索引向量,其N整数值介于1和M之间,例如,RandomIndex=randi(M,[1,N]) 现在我想生成一个包含条目的行向量 result = [A(RandomIndex(1),1), A(RandomIndex(2),2), ..., A(RandomIndex(N),N)] 这样做的有效方法是什么?这应该是一个非常便宜的操作,但我所有的实现都很慢。我不认为在Matlab中有一个符号可以直接做到这一点,是吗 到目前为止,最快的

我有一个巨大的矩阵,比如说,
a=rand([M,N])
和一个索引向量,其
N
整数值介于
1
M
之间,例如,
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));

有没有更有效的方法?

直接使用索引

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

直接使用索引

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

RandomIndex
1:N
给出的行和列索引转换为基于
size(A)
的线性索引,然后可以直接使用该索引对
A
进行索引

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

另一种方法是使用
RandomIndex
1:N
返回
NxN
矩阵,然后使用

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

使用

RandomIndex
1:N
给出的行和列索引转换为基于
size(A)
的线性索引,然后可以直接使用该索引对
A
进行索引

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

另一种方法是使用
RandomIndex
1:N
返回
NxN
矩阵,然后使用


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

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

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

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

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

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

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

这不会产生正确的值。你的代码生成了
A(RandomIndex,1)
。。。好吧,然后回到可靠的
for
循环,这也是正确的。这是最规范的方法+1.这不会产生正确的值。你的代码生成了
A(RandomIndex,1)
。。。好吧,然后回到可靠的
for
循环,这也是正确的。这是最规范的方法+1.这不会产生正确的值。您的代码生成
A(随机索引,1)
@IKavanagh它肯定不会生成
A(随机索引,1)
。首先,没有
随机索引
,这是一个很好的尝试。第二,它没有理由被限制在
A(,1)
,因为它使用
A
中所有条目的随机索引。如果您费心运行代码,您将看到
idx(1)=8148
,这是元素
A(82,48)
。但是,嘿…为什么要麻烦…只是巨魔…这并不能产生OP想要的东西。从他的问题上看很清楚。他有
A
RandomIndex
,如果他将
RandomIndex
应用于
A
,就像你的问题中的
t=A(RandomIndex)
它将生成
A(RandomIndex,1)
就像在我的评论中一样。
idx(1)=8148
A(82,48)
与这个问题有什么关系?@IKavanagh是正确的。问题是要生成随机的行位置,但列位置是按预定义顺序排列的:
col=1,2,…,N
。本质上,OP希望生成:
A(随机数)1、A(随机数)2、…、A(随机数)
。此代码不执行OP要求的操作。主要是它不能保证列访问是以OP要求的方式进行的。您正在生成列主索引,这很好,但它没有按正确的顺序进行,这不会生成正确的值。您的代码生成
A(随机索引,1)
@IKavanagh它肯定不会生成
A(随机索引,1)
。首先,没有
随机索引
,这是一个很好的尝试。第二,它没有理由被限制在
A(,1)
,因为它使用
A
中所有条目的随机索引。如果您费心运行代码,您将看到
idx(1)=8148
,这是元素
A(82,48)
。但是,嘿…为什么要麻烦…只是巨魔…这并不能产生OP想要的东西。从他的问题上看很清楚。他有
A
RandomIndex
,如果他将
RandomIndex
应用于
A
,就像你的问题中的
t=A(RandomIndex)
它将生成
A(RandomIndex,1)
就像在我的评论中一样。
idx(1)=8148
A(82,48)
与这个问题有什么关系?@IKavanagh是正确的。问题是要生成随机的行位置,但列位置是按预定义顺序排列的:
col=1,2,…,N
。本质上,OP希望生成:
A(随机数)1、A(随机数)2、…、A(随机数)
。此代码不执行OP要求的操作。主要是它不能保证列访问是以OP要求的方式进行的。您正在生成列主索引,这很好,但它的顺序不正确。加上1是这个问题的第一个正确答案。事实证明,手动为这种特殊情况复制sub2ind更快,即
A(M*(