переформулировка для цикла с векторизацией или другим подходом - октава - PullRequest
0 голосов
/ 21 января 2019

Есть ли способ векторизовать (или переформулировать) каждое тело цикла в этом коде:

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 k=1:length(dcat)-1        
    ii=find(dates>=dcat(k)&dates<dcat(k+1))  
endfor

с этим:

nk=1:length(dcat)-1;
ii2=find(dates>=dcat(nk)&dates<dcat(nk+1));

, а также с использованием bsxfun:

ii2=find(bsxfun(@and,bsxfun(@ge,dates,nk),bsxfun(@lt,dates,nk+1)));

, но безрезультатно.Оба этих подхода дают одинаковый результат и не соответствуют использованию цикла for (с точки зрения элементов и размера вектора).

Для информации h - это вектор, который содержит столб воды в метрах, а даты - это вектор (целое число с двумя цифрами), который содержит даты, в которые было произведено измерение для соответствующего столба воды.Входной файл может быть найден здесь: https://drive.google.com/open?id=1EomLGYleaNtiGG2iV_9LRt425blxdIsm

Что касается вывода, я хочу иметь 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, который оченьотличается по значению и размеру вектора (я не могу опубликовать результат, потому что размер вектора слишком велик).

Может ли кто-нибудь помочь здесь отчаявшемуся новичку?Мне просто нужно переформулировать часть цикла в лучшую, более лаконичную версию.

Если необходимо добавить больше деталей, пожалуйста, не стесняйтесь спрашивать меня.

1 Ответ

0 голосов
/ 21 января 2019

Вы можете использовать hist3 :

pkg load statistics
[obs, ~] = hist3([dates(:) h(:)] ,'Edges', {dcat,hcat});
...