Valid indices are restricted in parlor loop

1 回表示 (過去 30 日間)
Mark Buckup
Mark Buckup 2019 年 10 月 14 日
回答済み: Walter Roberson 2019 年 10 月 14 日
Is anyone able to help me understand how to format my arrays so I don't receieve this error. The error arises when I try to fill portions of my "CD8_image" zeros array with values inside the parfor loop.
region_width = width_end - width_start + 1; %fence post
region_height = height_end - height_start + 1; %fence post
interval = 2000;
number_x_tiles = region_width/interval;
number_y_tiles = region_height/interval;
CD8_image = zeros(region_height, region_width);
parfor i=1:(number_x_tiles)
frame_x_start = width_start + interval*(i-1);
frame_x_end = width_start + interval*i - 1; %fence post
for j=1:(number_y_tiles)
frame_y_start = height_start + interval*(j-1);
frame_y_end = height_start + interval*j - 1; %fence post
I1 = imread('CD8.tif','PixelRegion',{[frame_y_start frame_y_end],[frame_x_start frame_x_end]});
contrast_I1 = histeq(I1); %increase contrast
R_I1 = contrast_I1(:,:,1);
B_I1 = contrast_I1(:,:,3);
mask1 = R_I1 > B_I1 & R_I1 <160 & B_I1 < 40; %mess with these for red
F = medfilt2(mask1); %filter 1 (noise1)
F1_I1 = wiener2(F,[3 3]); %filter 2 (noise2)
F2_I1 = medfilt2(F1_I1); %filter 3 (noise1, try2)
F3_I1 = bwareafilt(F2_I1,[200 5000000]); %filter 4 (size)
height_1 = interval*(j-1)+1;
height_2 = interval*j;
width_1 = interval*(i-1);
width_2 = interval*i;
CD8_image(height_1:height_2,width_1:width_2) = F3_I1;
end
frame_y_start = height_start + interval*(j-1);
frame_y_end = height_start + interval*j - 1; %fence post
I1 = imread('CD8.tif','PixelRegion',{[frame_y_start frame_y_end],[frame_x_start frame_x_end]});
contrast_I1 = histeq(I1); %increase contrast
R_I1 = contrast_I1(:,:,1);
B_I1 = contrast_I1(:,:,3);
mask1 = R_I1 > B_I1 & R_I1 <160 & B_I1 < 40; %mess with these for red
F = medfilt2(mask1); %filter 1 (noise1)
F1_I1 = wiener2(F,[3 3]); %filter 2 (noise2)
F2_I1 = medfilt2(F1_I1); %filter 3 (noise1, try2)
F3_I1 = bwareafilt(F2_I1,[200 5000000]); %filter 4 (size)
CD8_image((interval*(j-1))+1:interval*j,(interval*(i-1)+1):interval*i) = F3_I1;
end

回答 (1 件)

Walter Roberson
Walter Roberson 2019 年 10 月 14 日
You cannot do that. Output arrays must be indexed in very simple ways, never as a range computed from the loop variable.
You can reorder the output to be tile height by tile width by number of tiles and write into (:, :, tilenumber) and then after the loop permute and reshape as needed. Or you can reorder to tile height by tile width by number of y tiles by number of x tiles, and inside the x tile loop construct a temporary 3d variable with the third dimension ordered by y tile number, and then after the y loop, write the 3d array into (:,:,:, x tilenumber), and then after the parfor permute and reshape as needed.

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by