这个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
答案 0 :(得分:1)
看起来你正在尝试索引行专业。但Octave指数专栏。您可以转置输入以获得正确的指示。此外,如果要索引第二列,则只需添加第一列的长度即可。
试试这个:
data2 = data';
sample2 = data2([idx + [0:size(idx,1)-1]'*size(data,2)])
第一行只是对矩阵进行转置,以便得到原始行的索引。
第二行通过添加原始数据行的长度将索引矩阵修改为总索引而不是行索引,然后引用数据以提供结果。