accumarray error: Second input VAL must be a vector with one element for each row in SUBS, or a scalar
4 views (last 30 days)
Show older comments
K M Ibrahim Khalilullah
on 19 Jan 2018
Answered: K M Ibrahim Khalilullah
on 20 Jan 2018
Error using accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a scalar.
Error in descriptFPoints (line 160) DescriptVector = accumarray( AngleBinsShifted, SubPatch_norm(IndexMaskOfBlocks), [ NOfBins*NOfWindows^2, 1 ] ); My code segment is given below:
for i = 1:N
%---------------- Data of feature point ---------------%
Scale = HrLOrntPoints(i,3);
MainOrient = deg2rad(HrLOrntPoints(i,6));
row0 = HrLOrntPoints(i,4);
clmn0 = HrLOrntPoints(i,5);
Step = StepSampleFunction( Scale );
%-------------- Neighborhood in new coord -------------%
% new coordinates received from old ones by rotation, and shift by [ row0, clmn0 ]
mx = max( ceil(2*NOfWindows*Step), round(3*Scale) + 1 );
ind = -mx:mx;
% pay attention, that coordinates are taken in column-major order, so
% assignments below of Patch is consistent
[ Clmn, Row ] = meshgrid( ind, ind );
% tmp2 need to be >= 4*NOfWindows, in order to descript point after
% mx, that was choosen before, provide this
tmp2 = 2*mx + 1; tmp = tmp2^2;
Coord_new = zeros( tmp, 2 );
Coord_new( :, 2 ) = Row(:);
Coord_new( :, 1 ) = Clmn(:);
Coord_new = Coord_new';
%------ Converting coordinates to original form -------%
Rotation = [ cos(MainOrient) -sin(MainOrient); sin(MainOrient) cos(MainOrient) ];
% Coord_orig(1,:) - column coord, that correspond to Coord_new( 1, : ).
% Coord_orig(2,:) - rows ...
Coord_orig = round( (Rotation)*Coord_new + repmat( [ clmn0 row0 ]', 1, tmp ) );
%---------- Converting to linear indexes -------------%
IndOfRotatedPatch = sub2ind( [ Nrow, Nclmn ], Coord_orig( 2,: )', Coord_orig( 1,: )' );
%---------- Assigning values to the patch -------------%
Patch = zeros( tmp2 );
Patch(:) = img( IndOfRotatedPatch );
%------------------ Derivative mask -------------------%
ind = -round(3*Scale):round(3*Scale);
[ X, Y ] = meshgrid( ind, ind );
dGdx = -X .* exp(-( X.*X + Y.*Y )/(2*Scale*Scale)) ./ ((Scale^4)*(2*pi));
dGdy = -Y .* exp(-( X.*X + Y.*Y )/(2*Scale*Scale)) ./ ((Scale^4)*(2*pi));
%----------------- Window derivatives -----------------%
% also possible to do convolution, cause gaussian symmetric
Patchx = imfilter(Patch, dGdx, 'same');
Patchy = imfilter(Patch, dGdy, 'same');
%----------------- Norm of gradients ------------------%
gradient_norm = sqrt(Patchx.^2 + Patchy.^2);
%------------- Avaraging norm gradients --------------%
g = fspecial('gaussian',max(1,fix( 6*Scale*Factor )), Scale*Factor);
gradient_norm = imfilter(gradient_norm, g, 'same');
%----------------- Angles of gradients ----------------%
gradient_angles = rad2deg( atan2( Patchy, Patchx ) + pi );
%--------- Taking sub-window for description ----------%
% I'm taking 'center pixel'( Feature point, with coordinates [ row0, clmn0 ] in image ) to be in
% new/sub-patch coordinates at [ p, p ]
% p = round(tmp2/2)
p = mx + 1;
% so I'll have patches of size 4*NOfWindows x 4*NOfWindows
SubPatch_norm = gradient_norm( max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step) ), 1), max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step)), 1) );
SubPatch_angles = gradient_angles( max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step) ), 1), max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step)), 1) );
%-------------- Assigning angles 2 bins ---------------%
[tmp, AngleBins] = histc( SubPatch_angles(IndexMaskOfBlocks), Edges4Hist );
%---------------- Shifting angle bins -----------------%
AngleBinsShifted = AngleBins + IndexShiftBins4Accum;
%-------- Accumulating norms 2 according bins ---------%
DescriptVector = accumarray(AngleBinsShifted, SubPatch_norm(IndexMaskOfBlocks), [ NOfBins*NOfWindows^2, 1 ] );
DescriptVector = min( DescriptVector/norm(DescriptVector), Thresh );
DescriptVector = DescriptVector/norm(DescriptVector);
%---------------- Assign values 2 matrix --------------%
DescriptFPVector( i, : ) = (DescriptVector)';
% if strcmp( SwitchWaitbars, 'on' )
% waitbar(i/N)
% end
end
2 Comments
Accepted Answer
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!