Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 当使用迭代器访问数据时,如何对循环进行矢量化?_Matlab_Vectorization - Fatal编程技术网

Matlab 当使用迭代器访问数据时,如何对循环进行矢量化?

Matlab 当使用迭代器访问数据时,如何对循环进行矢量化?,matlab,vectorization,Matlab,Vectorization,假设我有 data = rand(10000,1); % 10000x1 double x = 8; y = 10; offset = 5000; % x,y and offset are scalar. 目前,我已经实现了如下逻辑: tempData=zeros(x,y) for i=1:x tempData(i,:)=data(offset+i-1:x:offset + (x*y) -1) end 我已经实现了从偏移量开始获取长度为y的等距数据并将其划分为x存储桶的逻辑。是否可以

假设我有

data = rand(10000,1); % 10000x1 double
x = 8;
y = 10;
offset = 5000; % x,y and offset are scalar.
目前,我已经实现了如下逻辑:

tempData=zeros(x,y)
for i=1:x
    tempData(i,:)=data(offset+i-1:x:offset + (x*y) -1)
end
我已经实现了从偏移量开始获取长度为
y
的等距数据并将其划分为
x
存储桶的逻辑。是否可以将此代码矢量化

如果是,那么我想对情况进行矢量化,其中
x
y
offset
是长度相等的向量,每个
x
y
offset
值对应的集合给出不同的
tempData
。我认为
tempData
的大小应该是
零(A,max(X),max(Y))
,其中
A
是向量的公共长度
X
Y
offset
,这将容纳所有数据范围。但是我也不知道如何实现这个逻辑。

使用(或广播),可以预先计算所需的索引,然后通过这些索引一步访问数据。对于R2016b之前的MATLAB版本,必须使用该方法显式完成此操作

以下是给定代码的一种可能的矢量化:

data=rand(10000,1);
x=8;
y=10;
偏移量=5000;
tempData=零(x,y);
对于ii=1:x
tempData(ii,:)=数据(偏移量+ii-1:x:offset+(x*y)-1);
结束
临时数据
%MATLAB版本R2016b及更新版本
idx=[0:x-1].+offset+[0:x:(x*y)-1];
%R2016b之前的MATLAB版本
%idx=bsxfun(@plus,bsxfun(@plus,[0:x-1]),偏移量,[0:x:(x*y)-1]);
tempData2=数据(idx)
disp(['不同数组元素的数目:'。。。
num2str(numel(find(tempData~=tempData2)))];
输出:

tempData=
0.8066402   0.6572843   0.9425518   0.9663419   0.9700796   0.2132531   0.0562514   0.7089385   0.1911747   0.9513211
0.3150179   0.4987158   0.5472079   0.3804589   0.6569250   0.9619353   0.1204870   0.6133104   0.7718005   0.8298695
0.5942941   0.2964820   0.5767488   0.2801063   0.4969586   0.6939726   0.6652277   0.9043894   0.8220853   0.6501431
0.5398818   0.0067256   0.5347702   0.0935663   0.9080668   0.2440419   0.5053460   0.2064903   0.9822692   0.0440910
0.2567786   0.2294226   0.8511809   0.6516491   0.1073913   0.8241950   0.9817716   0.8543800   0.3400275   0.9529938
0.5700380   0.9455092   0.5102088   0.5539329   0.0058831   0.6627464   0.3184132   0.6538248   0.5766122   0.8352150
0.4384866   0.9618210   0.6841067   0.4880946   0.3056896   0.8244916   0.6240189   0.5447771   0.0317932   0.4269364
0.0054480   0.9978763   0.7917681   0.6482806   0.5933597   0.4203822   0.3880279   0.8687756   0.7550784   0.6491559
临时数据2=
0.8066402   0.6572843   0.9425518   0.9663419   0.9700796   0.2132531   0.0562514   0.7089385   0.1911747   0.9513211
0.3150179   0.4987158   0.5472079   0.3804589   0.6569250   0.9619353   0.1204870   0.6133104   0.7718005   0.8298695
0.5942941   0.2964820   0.5767488   0.2801063   0.4969586   0.6939726   0.6652277   0.9043894   0.8220853   0.6501431
0.5398818   0.0067256   0.5347702   0.0935663   0.9080668   0.2440419   0.5053460   0.2064903   0.9822692   0.0440910
0.2567786   0.2294226   0.8511809   0.6516491   0.1073913   0.8241950   0.9817716   0.8543800   0.3400275   0.9529938
0.5700380   0.9455092   0.5102088   0.5539329   0.0058831   0.6627464   0.3184132   0.6538248   0.5766122   0.8352150
0.4384866   0.9618210   0.6841067   0.4880946   0.3056896   0.8244916   0.6240189   0.5447771   0.0317932   0.4269364
0.0054480   0.9978763   0.7917681   0.6482806   0.5933597   0.4203822   0.3880279   0.8687756   0.7550784   0.6491559
不同数组元素的数目:0
编辑:关于对多个参数的扩展,也可以使用矢量化方法(参见)预先计算所需的索引,但是代码会变得绝对不可读。所以,至少在我看来,在前面介绍的矢量化代码中使用for循环是合适的。我还扩展了初始循环代码以进行比较:

data=rand(10000,1);
x=[6,8];
y=[10,9];
偏移量=[30005000];
A=努美尔(x);
tempData=零(最大值(x),最大值(y),A);
对于jj=1:A
对于ii=1:x(jj)
X=X(jj);
Y=Y(jj);
off=偏移量(jj);
tempData(ii,1:Y,jj)=数据(off+ii-1:X:off+(X*Y)-1);
结束
结束
临时数据
tempData2=零(最大值(x),最大值(y),A);
对于jj=1:A
X=X(jj);
Y=Y(jj);
off=偏移量(jj);
%MATLAB版本R2016b及更新版本
idx=[0:X-1]。+off+[0:X:(X*Y)-1];
%R2016b之前的MATLAB版本
%idx=bsxfun(@plus,bsxfun(@plus,[0:X-1]),off),[0:X:(X*Y)-1]);
tempData2(1:X,1:Y,jj)=数据(idx);
结束
临时数据2
disp(['不同数组元素的数目:'。。。
num2str(numel(find(tempData~=tempData2)))];
输出(缩短):

tempData=
ans(:,:,1)=
0.70758   0.71552   0.54604   0.73202   0.72717   0.16028   0.63080   0.48345   0.93159   0.96625
0.00320   0.11202   0.00179   0.90887   0.21830   0.91380   0.12110   0.31074   0.72834   0.52315
[...]
0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
ans(:,:,2)=
0.11960   0.35942   0.62390   0.45457   0.63471   0.23471   0.75660   0.34019   0.06892   0.00000
0.46443   0.21113   0.55479   0.51218   0.83697   0.30117   0.13935   0.81838   0.80042   0.00000
[...]
临时数据2=
ans(:,:,1)=
0.70758   0.71552   0.54604   0.73202   0.72717   0.16028   0.63080   0.48345   0.93159   0.96625
0.00320   0.11202   0.00179   0.90887   0.21830   0.91380   0.12110   0.31074   0.72834   0.52315
[...]
0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
ans(:,:,2)=
0.11960   0.35942   0.6