What does Assignment has more non-singleton rhs dimensions than non-singleton subscripts mean?
显示 更早的评论
Hey in a project I am trying to build a 3d matrix based off another 3d matrix to find a final temperature profile. The code up to the error is:
X = 0:0.1:5;
Y = 0:0.1:1;
Z = 0:0.1:20;
layer = zeros(length(X),length(Y));
layer1 = layer;
layers = layer;
layer1(:,:) = 52;
layers(:,:) = 22;
temperature_profile(:,:,1) = layer1;
for x = 2:length(Z)
temperature_profile(:,:,x) = layers;
end
layers2 = layer;
layers2(:,:) = 1;
for x = 1:length(Z)
temperature_profile2(:,:,x) = layers2;
end
H = zeros(length(X),length(Y),length(Z));
H(:,:,:) = 0.0000001;
G = ones(length(X),length(Y),length(Z));
V = temperature_profile2-temperature_profile;
t = 0;
Cp = 1;
V = 1;
A = 1;
rho = 1;
h = 1;
T0 = 22;
T1 = 52;
k = 1;
T = V < H;
while T ~= G
for z = 2:length(Z)
for y = 1:length(Y)
for x = 1:length(X)
if z == 1
temperature_profile2(x,y,z) = 52;
elseif z == 2
if y == 1
if x == 1
temperature_profile2(x,y,z) = ((0.00001)./(V.*rho.*Cp)).*(V.*k.*((((temperature_profile(x+2,y,z)-temperature_profile(x,y,z))./(0.2^2)))+(((temperature_profile(x,y+2,z)-temperature_profile(x,y,z))./(0.2^2)))+(((temperature_profile(x,y,z+2)-3.*temperature_profile(x,y,z)+2.*temperature_profile(x,y,z-1))./(4.*(0.2^2))))+A.*h.*(T0-T1)))+temperature_profile(x,y,z);
when it is run the Assignment has more non-singleton rhs dimensions than non-singleton subscripts mean error pops up and i'm not really sure what it means.
采纳的回答
更多回答(3 个)
the cyclist
2016-10-8
0 个投票
Your code (after adding 7 "end" statements) has been running for over 10 minutes for me, neither finishing nor crashing. Is it possible to post an example that errors out more quickly?
1 个评论
Walter Roberson
2016-10-8
The posted code does not change T or G, so if it made it into the while loop at all, it is going to infinite loop because of the while
Image Analyst
2016-10-8
When I get rid of the while, it runs with no error. Please post all the error - that means ALL the red text, not just part of it like you did.
This runs with no error:
X = 0:0.1:5;
Y = 0:0.1:1;
Z = 0:0.1:20;
layer = zeros(length(X),length(Y));
layer1 = layer;
layers = layer;
layer1(:,:) = 52;
layers(:,:) = 22;
temperature_profile(:,:,1) = layer1;
for x = 2:length(Z)
temperature_profile(:,:,x) = layers;
end
layers2 = layer;
layers2(:,:) = 1;
for x = 1:length(Z)
temperature_profile2(:,:,x) = layers2;
end
H = zeros(length(X),length(Y),length(Z));
H(:,:,:) = 0.0000001;
G = ones(length(X),length(Y),length(Z));
V = temperature_profile2-temperature_profile;
t = 0;
Cp = 1;
V = 1;
A = 1;
rho = 1;
h = 1;
T0 = 22;
T1 = 52;
k = 1;
T = V < H;
% while T ~= G
for z = 2:length(Z)
for y = 1:length(Y)
for x = 1:length(X)
if z == 1
temperature_profile2(x,y,z) = 52;
elseif z == 2
if y == 1
if x == 1
temperature_profile2(x,y,z) = ((0.00001)./(V.*rho.*Cp)).*(V.*k.*((((temperature_profile(x+2,y,z)-temperature_profile(x,y,z))./(0.2^2)))+(((temperature_profile(x,y+2,z)-temperature_profile(x,y,z))./(0.2^2)))+(((temperature_profile(x,y,z+2)-3.*temperature_profile(x,y,z)+2.*temperature_profile(x,y,z-1))./(4.*(0.2^2))))+A.*h.*(T0-T1)))+temperature_profile(x,y,z);
end
end
end
end
end
end
msgbox('Done');
% end
Walter Roberson
2016-10-8
You define temperature_profile and temperature_profile2 as three dimensional objects.
You define V = temperature_profile2-temperature_profile, so V is a three dimensional object.
Your code has
temperature_profile2(x,y,z) = ((0.00001)./(V.*rho.*Cp)).*(V.*k.*((((temperature_profile(x+2,y,z)-temperature_profile(x,y,z))./(0.2^2)))+(((temperature_profile(x,y+2,z)-temperature_profile(x,y,z))./(0.2^2)))+(((temperature_profile(x,y,z+2)-3.*temperature_profile(x,y,z)+2.*temperature_profile(x,y,z-1))./(4.*(0.2^2))))+A.*h.*(T0-T1)))+temperature_profile(x,y,z);
On the left side we can see assignment to a single location.
On the right side, every reference to temperature_profile and temperature_profile2 are subscripted so those reference are all scalars as well. k and rho and cp and T0 and T1 and A are all scalars as well, so those are fine.
But the code refers to V in a couple of places, and V is a three dimensional object, so the result of the right hand side is going to be a three dimensional object. And you cannot store that three dimensional object into a scalar.
I suspect you want the references to be to V(x,y,z)
It looks to me that you could probably vectorize the code. For example,
temperature_profile(x+2,y,z)-temperature_profile(x,y,z)
could potentially be
temperature_profile(3:end,:,:)-temperature_profile(1:end-2,:,:)
The boundary conditions like filling in the 52 can be handled in vectorized form as well by expanding the matrix by one in that direction and writing in 52 to that slice at each step.
类别
在 帮助中心 和 File Exchange 中查找有关 Surfaces, Volumes, and Polygons 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!