在MATLAB中从2D矩阵中提取给定每行列索引的2D矩阵的元素

Gre*_*ack 4 indexing matlab matrix

我试图从定义其索引的矩阵块重新采样我的数据.希望这个例子可以说清楚:

A=rand(18400,100);
A_IDX=randi([1 100],[18400 100]);
Run Code Online (Sandbox Code Playgroud)

A_IDX包括18400行和100列.我想AA_IDX索引处提取矩阵.结果将是这样的:

A=[1 2 3; 4 5 6];
A_IDX=[1 3; 2 3];
A_Result=[1 3; 5 6];
Run Code Online (Sandbox Code Playgroud)

我尝试A(:,A_IDX)但是这给了我1840x184000的矩阵大小,这不是我想要做的第一个.有人可以帮忙吗?提前致谢!

Div*_*kar 7

我们可以得到那些索引的线性索引等价,然后简单地索引到输入数组就可以得到所需的输出.现在,为了获得这些线性索引,我们将利用bsxfun与索引计算相关的数学计算,这基本上涉及缩放和偏移.

使用列索引的2D数组进行索引

对于2D一系列列索引,我们会 -

function out = take_cols(a, col_idx)

n = size(a,1);
lidx = bsxfun(@plus,(col_idx-1)*n,(1:n).');
out = a(lidx);
Run Code Online (Sandbox Code Playgroud)

样品运行 -

>> a
a =
    39    83    39    48    36
    58    74    20    19    50
    69    97    65    34    57
    47    58    80    24    51
>> col_idx
col_idx =
     2     4
     3     5
     1     4
     2     5
>> take_cols(a, col_idx)
ans =
    83    48
    20    50
    69    34
    58    51
Run Code Online (Sandbox Code Playgroud)

使用2D索引行索引进行索引

对于2D行索引数组,它将是 -

function out = take_rows(a, row_idx)

[m,n] = size(a);
lidx = bsxfun(@plus,row_idx, (0:n-1)*m);
out = a(lidx);
Run Code Online (Sandbox Code Playgroud)

样品运行 -

>> a
a =
    39    83    39    48    36
    58    74    20    19    50
    69    97    65    34    57
    47    58    80    24    51
>> row_idx
row_idx =
     3     2     3     1     2
     4     3     4     2     4
>> take_rows(a, row_idx)
ans =
    69    74    65    48    50
    47    97    80    19    51
Run Code Online (Sandbox Code Playgroud)