Octave:我怎样才能将这个for-lop矢量化?

时间:2018-01-17 01:53:37

标签: matlab loops vectorization octave

这个for循环可以被矢量化吗? 我希望能够对此代码的for循环进行矢量化,以获得类似“sample”的矩阵。试图进行矢量化我得到了“sample2”矩阵,但正如你所看到的那样,当我将“数据”作为矩阵而不是矢量时,由于线性索引它没有显示我想要的每行值。

close all; clear all; clc;
N=5; n=10; n1=2; n2=8;
rand('state', sum(100*clock));  
choose=round(((n-1)*rand(N,n))+1);
data=choose.^2;
idx=choose(:,n1:n2);
for i=1:N
dat=data(i,:); 
sample(i,:)=dat(idx(i,:));
end

%Trying to vectorize to get the same result
sample2(:,(n1:n2)-n1+1)=data(idx);

结果:

data =
36    64    64    25    81     4   100    36    49    25
 4     4     1    16     4    16    81    16   100    64
36    81    36    25    16    16     1    64    49     4
36    64    49    49    25    36   100    64    81    64
 1    16    16    49    64    49    81     4    16    64

idx =
8    8    5    9    2   10    6
2    1    4    2    4    9    4
9    6    5    4    4    1    8
8    7    7    5    6   10    8
4    4    7    8    7    9    2

sample =
36    36    81    49    64    25     4
 4     4    16     4    16   100    16
49    16    16    25    25    36    64
64   100   100    25    36    64    64
49    49    81     4    81    16    16

sample2 =
81   81    1   64    4   16   64
4    36   36    4   36   64   36
64   64    1   36   36   36   81
81    4    4    1   64   16   81
36   36    4   81    4   64    4

1 个答案:

答案 0 :(得分:1)

看起来你正在尝试索引行专业。但Octave指数专栏。您可以转置输入以获得正确的指示。此外,如果要索引第二列,则只需添加第一列的长度即可。

试试这个:

data2 = data';
sample2 = data2([idx + [0:size(idx,1)-1]'*size(data,2)])

第一行只是对矩阵进行转置,以便得到原始行的索引。

第二行通过添加原始数据行的长度将索引矩阵修改为总索引而不是行索引,然后引用数据以提供结果。