Error updating Scatter: Data lengths must match - but they do...

조회 수: 4 (최근 30일)
Megan Jurczak
Megan Jurczak 2021년 8월 6일
댓글: Megan Jurczak 2021년 8월 9일
Hello,
I am trying to use a continuous value change slider UI to add a fourth dimension (time) to a graphic showing the position of GNSS satellites used in a navigation solution.
function myslider(gnss, truth)
[x_earth,y_earth,z_earth] = ellipsoid(0,0,0,6378137,6378137,6356752.31424518,30);
figure(); surf(x_earth,y_earth,z_earth, 'EdgeColor', '#0072BD', 'FaceColor', '#0072BD',...
'FaceAlpha', 0.3); hold on; % plot the earth
scatter3(truth.pos(1),truth.pos(2),truth.pos(3),85,'MarkerFaceColor','y','MarkerEdgeColor','k','Marker','p'); % add truth
u_tow = unique(gnss.tow);
slide = min(u_tow):1:max(u_tow);
colour = gnss.gnssId; % add a unique color to identify each constellation
colour(colour(:,1)==0,1:3) = repmat([0, 0.4470, 0.7410], sum(colour(:,1)==0),1);
colour(colour(:,1)==2,:) = repmat([0.8500, 0.3250, 0.0980], sum(colour(:,1)==2),1);
colour(colour(:,1)==6,:) = repmat([0.4660, 0.6740, 0.1880], sum(colour(:,1)==6),1);
hplot = scatter3(gnss.satPos(gnss.tow == slide(1),1),gnss.satPos(gnss.tow == slide(1),2), ...
gnss.satPos(gnss.tow == slide(1),3), ones(sum(gnss.tow == slide(1)),1)*25,colour(gnss.tow == slide(1),:), 'filled');
h = uicontrol('style','slider','units','pixel','position',[20 20 250 20], 'Min',1,'Max',numel(u_tow),...
'value', 1,'SliderStep',[0.001 0.5]);
addlistener(h,'ContinuousValueChange',@(hObject, event) makeSlidePlot(hObject,hplot,slide,gnss,colour,truth));
end
function makeSlidePlot(hObject,hplot,slide,gnss,colour,truth) %truth added to attempt to stop error when no satellites available
n = get(hObject,'Value'); n=round(n);
set(hplot,'xdata',[truth.pos(1); gnss.satPos(gnss.tow == slide(n),1)]','ydata',[truth.pos(2); gnss.satPos(gnss.tow == slide(n),2)]','zdata',[truth.pos(3); gnss.satPos(gnss.tow == slide(n),3)]', 'cdata', [1 1 0; colour(gnss.tow == slide(n),1:3)]);
set(gca,'XLim',[-10000000 30000000],'YLim',[-10000000 30000000],'ZLim',[-10000000 30000000]);
drawnow;
end
The function is able to plot the initial data with no issues, but when updating the values it gives the following error:
  • Warning: Error updating Scatter. Data lengths must match.
This happens in the function makeSlidePlot on the line starting with set(hplot
I've tried looking at which values are assigned to 'xdada'/'ydata'/'zdata'/'cdata' when this error occurs and can't figure out why they won't work. As an example, some values are below (typed by hand, not actual matlab code just used for easy reading):
x_data = [4.001157205000000e+06;2.572546709530618e+07;8.678234779917900e+06;3.952943480663775e+06]; % 4x1
y_data = [-1.430807600000000e+04;3.867255631461378e+06;-1.347380604311346e+07;1.025898885350909e+07]; % 4x1
z_data = [4.950553757000000e+06;6.564856076579228e+06;2.489296866319447e+07;2.302901468983255e+07]; % 4x1
c_data = [1.0000 1.0000 0; ...
0 0.4470 0.7410; ...
0.8500 0.3250 0.0980; ...
0.4660 0.6740 0.1880]; % 4x3
If you can provide some insight it would be very appreciated. Or if you would prefer that I simplify the code and names of variables please let me know.
Thanks so much in advance!! (BTW: using Matlab R2019b).
EDIT: As per the comment, attached is the data for gnss and truth and an image of the error/warningIn RunSimLite (line 52)  Warning: Error updating Scatter.   Data lengths must match.   > In defaulterrorcallback (line 12)   In RunSimLite>makeSlidePlot (line 191)   In RunSimLite>@(hObject,event)makeSlidePlot(hObject,hplot,slide,gnss,colour,truth) (line 183)
  댓글 수: 3
Megan Jurczak
Megan Jurczak 2021년 8월 6일
@Cris LaPierre Thank you so much for your comment :) I have updated the question as per your suggestions. Hopefully this is sufficient in finding a solution
Cris LaPierre
Cris LaPierre 2021년 8월 6일
편집: Cris LaPierre 2021년 8월 6일
I do not get an error when running these functions with this data in R2019b. I scrolled through the entire dataset.
Try running just the following code in your MATLAB with the data you have shared and see if it works.
load matlabQuestion.mat
myslider(gnss, truth)
function myslider(gnss, truth)
[x_earth,y_earth,z_earth] = ellipsoid(0,0,0,6378137,6378137,6356752.31424518,30);
figure('visible','on');
surf(x_earth,y_earth,z_earth, 'EdgeColor', '#0072BD', 'FaceColor', '#0072BD',...
'FaceAlpha', 0.3); hold on; % plot the earth
scatter3(truth.pos(1),truth.pos(2),truth.pos(3),85,'MarkerFaceColor','y','MarkerEdgeColor','k','Marker','p'); % add truth
u_tow = unique(gnss.tow);
slide = min(u_tow):1:max(u_tow);
colour = gnss.gnssId; % add a unique color to identify each constellation
colour(colour(:,1)==0,1:3) = repmat([0, 0.4470, 0.7410], sum(colour(:,1)==0),1);
colour(colour(:,1)==2,:) = repmat([0.8500, 0.3250, 0.0980], sum(colour(:,1)==2),1);
colour(colour(:,1)==6,:) = repmat([0.4660, 0.6740, 0.1880], sum(colour(:,1)==6),1);
hplot = scatter3(gnss.satPos(gnss.tow == slide(1),1),gnss.satPos(gnss.tow == slide(1),2), ...
gnss.satPos(gnss.tow == slide(1),3), ones(sum(gnss.tow == slide(1)),1)*25,colour(gnss.tow == slide(1),:), 'filled');
h = uicontrol('style','slider','units','pixel','position',[20 20 250 20], 'Min',1,'Max',numel(u_tow),...
'value', 1,'SliderStep',[0.001 0.5]);
addlistener(h,'ContinuousValueChange',@(hObject, event) makeSlidePlot(hObject,hplot,slide,gnss,colour,truth));
end
function makeSlidePlot(hObject,hplot,slide,gnss,colour,truth) %truth added to attempt to stop error when no satellites available
n = get(hObject,'Value'); n=round(n);
set(hplot,'xdata',[truth.pos(1); gnss.satPos(gnss.tow == slide(n),1)]','ydata',[truth.pos(2); gnss.satPos(gnss.tow == slide(n),2)]','zdata',[truth.pos(3); gnss.satPos(gnss.tow == slide(n),3)]', 'cdata', [1 1 0; colour(gnss.tow == slide(n),1:3)]);
set(gca,'XLim',[-10000000 30000000],'YLim',[-10000000 30000000],'ZLim',[-10000000 30000000]);
drawnow;
end

댓글을 달려면 로그인하십시오.

채택된 답변

Dave B
Dave B 2021년 8월 6일
편집: Dave B 2021년 8월 6일
I bet this is SizeData, you're setting it initially to:
ones(sum(gnss.tow == slide(1)),1)*25
So it matches the other data properties in length. But then later you're changing the length of the others and skipping SizeData.
I think if you don't expect to change sizedata, you could just set it to 25 initially, if you set it to a scalar, then Scatter should be okay with expanding it to match the length of the other data properties.
  댓글 수: 1
Megan Jurczak
Megan Jurczak 2021년 8월 9일
Absolutely perfect, thanks so much! Such a silly mistake on my part and I'm happy to finally have it solved. I really appreciate your effort and the concise answer :)

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by