【问题标题】:Octave: How can I vectorize this for-lop?Octave:我如何向量化这个 for-lop?
【发布时间】:2018-01-17 01:53:36
【问题描述】:

这个for循环可以向量化吗? 我希望能够对此代码的 for 循环进行矢量化,以获得像“样本”这样的矩阵。尝试向量化我得到了“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

【问题讨论】:

    标签: matlab loops vectorization octave


    【解决方案1】:

    看起来您正在尝试索引行专业。但是 Octave 索引列专业。您可以转置输入以使索引正确。另外,如果要索引到第二列,只需添加第一列的长度即可。

    试试这个:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 2013-12-22
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多