Why am I getting a vertcat error? (Matlab)
I am trying to plot the first row of my matrix against time t but I cannot figure out why my matrix yields the error: "vertcat:
Dimensions of matrices being concatenated are not consistent."
t = linspace(0,100);
y_mat = (1./t).*([1, t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
(3/2)*(exp(-t)-exp(-3*t)), 1-(3/2)*exp(-3*t)+
(1/2)*exp(-t)] * [(t-4)/3;1]);
plot(t,y_mat(1,:))
matlab matrix
add a comment |
I am trying to plot the first row of my matrix against time t but I cannot figure out why my matrix yields the error: "vertcat:
Dimensions of matrices being concatenated are not consistent."
t = linspace(0,100);
y_mat = (1./t).*([1, t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
(3/2)*(exp(-t)-exp(-3*t)), 1-(3/2)*exp(-3*t)+
(1/2)*exp(-t)] * [(t-4)/3;1]);
plot(t,y_mat(1,:))
matlab matrix
add a comment |
I am trying to plot the first row of my matrix against time t but I cannot figure out why my matrix yields the error: "vertcat:
Dimensions of matrices being concatenated are not consistent."
t = linspace(0,100);
y_mat = (1./t).*([1, t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
(3/2)*(exp(-t)-exp(-3*t)), 1-(3/2)*exp(-3*t)+
(1/2)*exp(-t)] * [(t-4)/3;1]);
plot(t,y_mat(1,:))
matlab matrix
I am trying to plot the first row of my matrix against time t but I cannot figure out why my matrix yields the error: "vertcat:
Dimensions of matrices being concatenated are not consistent."
t = linspace(0,100);
y_mat = (1./t).*([1, t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
(3/2)*(exp(-t)-exp(-3*t)), 1-(3/2)*exp(-3*t)+
(1/2)*exp(-t)] * [(t-4)/3;1]);
plot(t,y_mat(1,:))
matlab matrix
matlab matrix
edited Nov 16 '18 at 5:04
astroball
asked Nov 16 '18 at 4:58
astroballastroball
5218
5218
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
You can also write it out more explicitly. The equation reads:
[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]
Since each of those terms is a scalar, you can compute them for all t
at the same time using element-wise multiplication:
t = linspace(0,100);
pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
pt5 = (t-4)/3;
y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];
plot(t,y_mat)
This might be a bit more verbose, but I don't think it's any less readable than other solutions. And it is much more efficient: 0.0571 ms, versus 483.3 ms (syms solution) and 0.681 ms (loop solution), for a t
with 500 elements.
(Note that multiplying by 1./t
uses implicit singleton expansion. This works in MATLAB R2016b and newer. For older versions of MATLAB, use bsxfun
.)
add a comment |
You are thinking in the term of symbolic notation but implementing in matrix notation. When you do t = linspace(0,100);
it creates a 1x100
matrix (array). So when later on it is used in the definition of y_mat
, each expression used in the definition evaluates to 1x100
matrix. So your y_mat
definition is tying to do this : [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
which obviously fails.
You have two options:
Do all computations in the matrix notation by first computing the matrix multiplication separately and restructuring the matrices to represent the actual multiplication (ensure the 1
s are appropriately replicated).
OR
use Matlabs's symbolic variables and expressions probably like this :
syms t % creating symbolic variable
% creating symbolic expressions
f0 = 1/t
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]
% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error
% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));
This gives y_mat_vals
a 2x100
matrix, as the answer.
add a comment |
YOu have messed up your code..you need to be careful when typing such functions. To make it simple, I have used a loop.
t = linspace(0,100);
nt = length(t) ;
y_mat = zeros(2,nt) ;
for i = 1:nt
y_mat(:,i) = (1/t(i))*([1 t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
(3/2)*(exp(-t(i))-exp(-3*t(i))) 1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53331699%2fwhy-am-i-getting-a-vertcat-error-matlab%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can also write it out more explicitly. The equation reads:
[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]
Since each of those terms is a scalar, you can compute them for all t
at the same time using element-wise multiplication:
t = linspace(0,100);
pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
pt5 = (t-4)/3;
y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];
plot(t,y_mat)
This might be a bit more verbose, but I don't think it's any less readable than other solutions. And it is much more efficient: 0.0571 ms, versus 483.3 ms (syms solution) and 0.681 ms (loop solution), for a t
with 500 elements.
(Note that multiplying by 1./t
uses implicit singleton expansion. This works in MATLAB R2016b and newer. For older versions of MATLAB, use bsxfun
.)
add a comment |
You can also write it out more explicitly. The equation reads:
[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]
Since each of those terms is a scalar, you can compute them for all t
at the same time using element-wise multiplication:
t = linspace(0,100);
pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
pt5 = (t-4)/3;
y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];
plot(t,y_mat)
This might be a bit more verbose, but I don't think it's any less readable than other solutions. And it is much more efficient: 0.0571 ms, versus 483.3 ms (syms solution) and 0.681 ms (loop solution), for a t
with 500 elements.
(Note that multiplying by 1./t
uses implicit singleton expansion. This works in MATLAB R2016b and newer. For older versions of MATLAB, use bsxfun
.)
add a comment |
You can also write it out more explicitly. The equation reads:
[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]
Since each of those terms is a scalar, you can compute them for all t
at the same time using element-wise multiplication:
t = linspace(0,100);
pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
pt5 = (t-4)/3;
y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];
plot(t,y_mat)
This might be a bit more verbose, but I don't think it's any less readable than other solutions. And it is much more efficient: 0.0571 ms, versus 483.3 ms (syms solution) and 0.681 ms (loop solution), for a t
with 500 elements.
(Note that multiplying by 1./t
uses implicit singleton expansion. This works in MATLAB R2016b and newer. For older versions of MATLAB, use bsxfun
.)
You can also write it out more explicitly. The equation reads:
[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]
Since each of those terms is a scalar, you can compute them for all t
at the same time using element-wise multiplication:
t = linspace(0,100);
pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
pt5 = (t-4)/3;
y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];
plot(t,y_mat)
This might be a bit more verbose, but I don't think it's any less readable than other solutions. And it is much more efficient: 0.0571 ms, versus 483.3 ms (syms solution) and 0.681 ms (loop solution), for a t
with 500 elements.
(Note that multiplying by 1./t
uses implicit singleton expansion. This works in MATLAB R2016b and newer. For older versions of MATLAB, use bsxfun
.)
answered Nov 16 '18 at 7:58
Cris LuengoCris Luengo
22.1k52253
22.1k52253
add a comment |
add a comment |
You are thinking in the term of symbolic notation but implementing in matrix notation. When you do t = linspace(0,100);
it creates a 1x100
matrix (array). So when later on it is used in the definition of y_mat
, each expression used in the definition evaluates to 1x100
matrix. So your y_mat
definition is tying to do this : [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
which obviously fails.
You have two options:
Do all computations in the matrix notation by first computing the matrix multiplication separately and restructuring the matrices to represent the actual multiplication (ensure the 1
s are appropriately replicated).
OR
use Matlabs's symbolic variables and expressions probably like this :
syms t % creating symbolic variable
% creating symbolic expressions
f0 = 1/t
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]
% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error
% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));
This gives y_mat_vals
a 2x100
matrix, as the answer.
add a comment |
You are thinking in the term of symbolic notation but implementing in matrix notation. When you do t = linspace(0,100);
it creates a 1x100
matrix (array). So when later on it is used in the definition of y_mat
, each expression used in the definition evaluates to 1x100
matrix. So your y_mat
definition is tying to do this : [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
which obviously fails.
You have two options:
Do all computations in the matrix notation by first computing the matrix multiplication separately and restructuring the matrices to represent the actual multiplication (ensure the 1
s are appropriately replicated).
OR
use Matlabs's symbolic variables and expressions probably like this :
syms t % creating symbolic variable
% creating symbolic expressions
f0 = 1/t
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]
% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error
% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));
This gives y_mat_vals
a 2x100
matrix, as the answer.
add a comment |
You are thinking in the term of symbolic notation but implementing in matrix notation. When you do t = linspace(0,100);
it creates a 1x100
matrix (array). So when later on it is used in the definition of y_mat
, each expression used in the definition evaluates to 1x100
matrix. So your y_mat
definition is tying to do this : [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
which obviously fails.
You have two options:
Do all computations in the matrix notation by first computing the matrix multiplication separately and restructuring the matrices to represent the actual multiplication (ensure the 1
s are appropriately replicated).
OR
use Matlabs's symbolic variables and expressions probably like this :
syms t % creating symbolic variable
% creating symbolic expressions
f0 = 1/t
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]
% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error
% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));
This gives y_mat_vals
a 2x100
matrix, as the answer.
You are thinking in the term of symbolic notation but implementing in matrix notation. When you do t = linspace(0,100);
it creates a 1x100
matrix (array). So when later on it is used in the definition of y_mat
, each expression used in the definition evaluates to 1x100
matrix. So your y_mat
definition is tying to do this : [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1]
which obviously fails.
You have two options:
Do all computations in the matrix notation by first computing the matrix multiplication separately and restructuring the matrices to represent the actual multiplication (ensure the 1
s are appropriately replicated).
OR
use Matlabs's symbolic variables and expressions probably like this :
syms t % creating symbolic variable
% creating symbolic expressions
f0 = 1/t
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]
% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error
% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));
This gives y_mat_vals
a 2x100
matrix, as the answer.
edited Nov 16 '18 at 8:23
answered Nov 16 '18 at 7:07
Saurabh SainiSaurabh Saini
186110
186110
add a comment |
add a comment |
YOu have messed up your code..you need to be careful when typing such functions. To make it simple, I have used a loop.
t = linspace(0,100);
nt = length(t) ;
y_mat = zeros(2,nt) ;
for i = 1:nt
y_mat(:,i) = (1/t(i))*([1 t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
(3/2)*(exp(-t(i))-exp(-3*t(i))) 1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)
add a comment |
YOu have messed up your code..you need to be careful when typing such functions. To make it simple, I have used a loop.
t = linspace(0,100);
nt = length(t) ;
y_mat = zeros(2,nt) ;
for i = 1:nt
y_mat(:,i) = (1/t(i))*([1 t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
(3/2)*(exp(-t(i))-exp(-3*t(i))) 1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)
add a comment |
YOu have messed up your code..you need to be careful when typing such functions. To make it simple, I have used a loop.
t = linspace(0,100);
nt = length(t) ;
y_mat = zeros(2,nt) ;
for i = 1:nt
y_mat(:,i) = (1/t(i))*([1 t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
(3/2)*(exp(-t(i))-exp(-3*t(i))) 1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)
YOu have messed up your code..you need to be careful when typing such functions. To make it simple, I have used a loop.
t = linspace(0,100);
nt = length(t) ;
y_mat = zeros(2,nt) ;
for i = 1:nt
y_mat(:,i) = (1/t(i))*([1 t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
(3/2)*(exp(-t(i))-exp(-3*t(i))) 1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)
answered Nov 16 '18 at 7:10
Siva Srinivas KolukulaSiva Srinivas Kolukula
1,1351613
1,1351613
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53331699%2fwhy-am-i-getting-a-vertcat-error-matlab%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown