[英]Octave: How can I vectorize this for-lop?
可以将此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
看起来您正在尝试索引专业行。 但是八度索引列专业。 您可以转置您的输入以得到正确的指数。 另外,如果要索引到第二列,则只需添加第一列的长度即可。
尝试这个:
data2 = data';
sample2 = data2([idx + [0:size(idx,1)-1]'*size(data,2)])
第一行只是转置矩阵,所以您将得到原始行的索引。
第二行通过添加原始数据行的长度,将索引矩阵修改为总索引,而不是行索引,然后引用数据以提供结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.