Matrix must agree HELP

Subscript indices must either be real positive integers or logicals.
Error in Skeleton_NS_solver (line 559)
plot(y(:,max(length(y)/2,ceil(length(y)/2)))',pp(:,max(length(pp)/2,ceil(length(pp)/2))+0.5*Uuu(:,max(length(Uuu)/2,ceil(length(Uuu)/2))).^2)','k-','Linewidth',1.5)

2 Comments

Could you include more of the code, specifically the area where the matrices are defined?
Also, it is easier to read if you could use the {}Code option to display the pasted code as regular coded format. Just makes it easier to see as separate lines, rather than a large block.
Okey, better? :)

Answers (2)

Guillaume
Guillaume on 19 Feb 2018

0 votes

y, pp, etc. are obviously at least 2D, so length of these can be the number of rows or columns depending on the matrix, whichever is the largest. So using length to filter the column sounds very iffy. No idea if that is the cause of the problem, but replacing length by size with an explicit dimension would be wise.
As per Bob comment, knowing the actual size of the matrices would help in diagnosing the true cause.

6 Comments

Subscript indices must either be real positive integers or logicals.
Error in Skeleton (line 559)
plot(y(:,max(size(y)/2,ceil(size(y)/2)))',pp(:,max(size(pp)/2,ceil(size(pp)/2))+0.5*Uuu(:,max(size(Uuu)/2,ceil(size(Uuu)/2))).^2)','k-','Linewidth',1.5)
K>>
The sane happens.. Oh god
y is 3x3 , pp is 3x3 Uuu is 4x4
Guillaume
Guillaume on 19 Feb 2018
Edited: Guillaume on 19 Feb 2018
I wrote size with an explicit dimension. If that length is supposed to be the number of columns, then it should be size(y, 2).
I also don't really understand the purpose of
max(x/2, ceil(x/2)) %with x > 0
It's always going to be
ceil(x/2)
However, that's not the problem. The problem is clear now that we have the size of the variables, you're trying to add a 3x1 vector pp(:, 2) with a 4x1 vector 0.5*Uuu(:, 2).^2. Adding vectors of different length is not something that matlab (or I) knows how to do.
edit: actually, that's also not your immediate problem. Your immediate problem is that one of your closing bracket is misplaced and thus you're doing:
pp(:, 2 + 0.5*Uuu(:, 2).^2)
instead of
pp(:, 2) + 0.5*Uuu(:, 2).^2
which of course is most likely to result in non-integer indices.
Once you fix that problem you'll run into the dimension mismatch error.
plot(y(:,max(length(y)/2,ceil(length(y)/2))',pp(:,max(length(pp)/2,ceil(length(pp)/2))+0.5*(Uuu(:,max(length(Uuu)/2,ceil(length(Uuu)/2))).^2)','k-','Linewidth',1.5)
That's the idea, the equation in the photo
okey by changing this: now the problem is in 483:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.
Error in Skeleton_NS_solver (line 483)
uut = [ones(1,N+1)*U_wall_bot, ones(N,1)*U_wall_left AA ones(N,1)*U_wall_right,ones(1,N+1)*U_wall_top];
483----->>> uut = [ones(1,N+1)*U_wall_bot, ones(N,1)*U_wall_left AA ones(N,1)*U_wall_right,ones(1,N+1)*U_wall_top];
Guillaume
Guillaume on 19 Feb 2018
Edited: Guillaume on 19 Feb 2018
Debugging by forum is not an efficient method. You would be better off using Jan's advice and using matlab's debugger.
You also need to start thinking about what you write
uut = [ones(1, N+1)*..., ones(N, 1)*...
The first expression is going to result in a matrix with 1 row, the second in a matrix with N rows. Of course they can't be concatenated horizontally since they don't have the same number of rows, just as the error message tells you.
And please, use the {}Format button when posting code. Can't you see that my post is a lot more readable than yours?
Jan
Jan on 19 Feb 2018
You can examine the reason of errors using the debugger: https://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html. Eitehr set a breakpoint in the failing line or stop Matlab automatically:
dbstop if error
The check the parts of the failing command:
plot(y(:, max(length(y)/2, ceil(length(y)/2)))', ...
pp(:, max(length(pp)/2, ...
ceil(length(pp)/2)) + 0.5 * Uuu(:, max(length(Uuu)/2,ceil(length(Uuu)/2))).^2)', ...
'k-', 'Linewidth', 1.5)
This is a very ugly command. Prefer to split it into parts, because it is easier to read and to maintain. Use spaces around operators and after commas.
tmpx = y(:, max(length(y) / 2, ceil(length(y) / 2)))';
tmpP = max(length(pp) / 2, ceil(length(pp) / 2));
tmpU = max(length(Uuu) / 2, ceil(length(Uuu) / 2));
tmpy = pp(:, tmpP + 0.5 * Uuu(:, tmpU) .^ 2)';
plot(tmpx, tmpy, 'k-', 'Linewidth', 1.5)
Now it is easier to find the error.

This question is closed.

Asked:

on 19 Feb 2018

Closed:

on 20 Aug 2021

Community Treasure Hunt

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

Start Hunting!