For loop 用矢量化或其他方法重新格式化循环-倍频程

For loop 用矢量化或其他方法重新格式化循环-倍频程,for-loop,vectorization,octave,bsxfun,For Loop,Vectorization,Octave,Bsxfun,在这段代码中,是否有任何方法可以矢量化(或重新格式化)每个循环体: col=load('col-deau'); %load data h=col(:,8); % corresponding water column dates=col(:,3); % and its dates %removing out-of-bound data days=days(h~=9999.000); h=h(h~=9999.000); dates=sort(dates(h~=9999.000)); [k,hc

在这段代码中,是否有任何方法可以矢量化(或重新格式化)每个循环体:

col=load('col-deau'); %load data

h=col(:,8); % corresponding water column
dates=col(:,3); % and its dates

%removing out-of-bound data
days=days(h~=9999.000);
h=h(h~=9999.000);
dates=sort(dates(h~=9999.000));

[k,hcat]=hist(h,nbin); %making classes (k) and boundaries of classes (hcat) of water column automatically

dcat=1:15; % make boundaries for dates
for k=1:length(dcat)-1 % Loop for each date class
    ii=find(dates>=dcat(k)&dates<dcat(k+1));% Counting dates corresponding to the boundaries of each date class
    for j=1:length(hcat)-1                                % Loop over each class of water column
        ij=find(h>=hcat(j)&h<hcat(j+1)); % Count water column corresponding to the boundaries of each water column class
        obs(k,j)=length(intersect(ii,ij));               % Find the size of each intersecting matrix
    end
end
但是没有用。这两种方法都产生相同的输出,并且与使用for循环的输出(在元素和向量大小方面)不一致

作为参考,h是一个以米为单位包含水柱的向量,日期是一个向量(两位整数),其中包含对相应水柱进行测量的日期。 可在此处找到输入文件:

至于输出,我想让ii像这样:

ii =

   1177
   1178
   1179
   1180
   1181
   1182
   1183
   1184
   1185
   1186
   1187
   1188
   1189
   1190
   1191
   1192
   1193
   1194
   1195
   1196
   1197
   1198
   1199
   1200
   1201
   1202
   1203
   1204
   1205
   1206
   1207
   1208
   1209
   1210
   1211
   1212
   1213
   1214
   1215
   1216
   1217
   1218
   1219
   1220
   1221
   1222
   1223
   1224
   1225
   1226
   1227
   1228
   1229
   1230
   1231
   1232
   1233
   1234
   1235
   1236
   1237
   1238
   1239
   1240
   1241
   1242
   1243
   1244
   1245
   1246
   1247
   1248
   1249
   1250
   1251
   1252
   1253
   1254
   1255
   1256
   1257
   1258
   1259
   1260
   1261
   1262
   1263
   1264
   1265
   1266
   1267
   1268
   1269
   1270
   1271
   1272
与第一种方法相反,我得到了ii2,它在值和向量大小方面非常不同(我无法发布结果,因为向量大小太大)

有人能帮一个绝望的新手吗?我只需要将循环部分重新格式化为更好、更简洁的版本

如果需要添加更多详细信息,请随时询问我

您可以使用:


你需要吗?我认为在没有解释和代表输入输出的情况下加入一些垃圾代码不是一个好主意。我相信这是可以解决的,密歇根州easier@rahnema1不,我只需要hist自动创建几类数据。@Andy我已经添加了输入文件,并将很快使用代表性的输出进行更新。@MochammadHusniRizal我认为可以使用
hist3
计算
obs
。谢谢!它可以工作,但在这个矩阵中还有一个额外的零行和列向量。你知道重写其他循环部分(ii和ij)的方法吗?当你手头有
obs
时,你不需要
ii
jj
。正如您在这里看到的,没有必要循环。设置
result=obs(1:end-1,1:end-1)
以删除零。您完全正确。我甚至没有意识到,我真傻。再次感谢!我将把你的答案标记为已接受。
nk=1:length(dcat)-1;
ii2=find(dates>=dcat(nk)&dates<dcat(nk+1));
ii2=find(bsxfun(@and,bsxfun(@ge,dates,nk),bsxfun(@lt,dates,nk+1)));
ii =

   1177
   1178
   1179
   1180
   1181
   1182
   1183
   1184
   1185
   1186
   1187
   1188
   1189
   1190
   1191
   1192
   1193
   1194
   1195
   1196
   1197
   1198
   1199
   1200
   1201
   1202
   1203
   1204
   1205
   1206
   1207
   1208
   1209
   1210
   1211
   1212
   1213
   1214
   1215
   1216
   1217
   1218
   1219
   1220
   1221
   1222
   1223
   1224
   1225
   1226
   1227
   1228
   1229
   1230
   1231
   1232
   1233
   1234
   1235
   1236
   1237
   1238
   1239
   1240
   1241
   1242
   1243
   1244
   1245
   1246
   1247
   1248
   1249
   1250
   1251
   1252
   1253
   1254
   1255
   1256
   1257
   1258
   1259
   1260
   1261
   1262
   1263
   1264
   1265
   1266
   1267
   1268
   1269
   1270
   1271
   1272
pkg load statistics
[obs, ~] = hist3([dates(:) h(:)] ,'Edges', {dcat,hcat});