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});