Why doesn't this program work?

조회 수: 2 (최근 30일)
John Kirk
John Kirk 2012년 9월 28일
% Weird1:
% Demonstrates some bizaar behavior of MatLAB
% Apparently scalar multiplication flips a vector from row to column.
% Or it is against the rules to put a variable on both sides of the
% equal sign; for example X(i) = 2*X(i)
% John Kirk email John.Kirk@Raymondcorp.com
clear all; clc; close all;
rpm = zeros(1000,1); % Now create all the data
for ii=1:1000;
if mod(ii,2) == 0; % is it even?
rpm(ii)=ii;
else
rpm(ii)=0;
end
end %rpm should now be vector with every other element zero
%Remove zero points for ii=2:(n-1);
count(1)=1;
count(1000)=1000;
for ii=2:(1000-1);
count(ii) = count(ii)+1;
if rpm(ii)==0;% if rpm(ii) is zero then
rpm(ii)=(rpm(ii-1)+rpm(ii+1))/2 % use average of non-zero points
else
% if it is not zero then do nothing to rpm(ii)
end
% shouldn't this statement be executed for every loop?
rpm(ii)= rpm(ii)*2;% multiply every element in rpm by 2
end% of for loop
plot(count,rpm)
% END of program *******************************************
% We have several theories for why this program does not work.
% One is that referring to rpm(ii) on both sides of the '='
% sign confuses MatLAB. The other, and almost certainly true,
% idea is we do not understand how MatLAB handles vectors and
% matrix's. We imagine that we are simply multiplying a
% scalar time each element in a vector when in fact we are
% doing matrix math and flipping a row vector into a column
% vector.
  댓글 수: 1
Jan
Jan 2012년 9월 28일
I cannot see any bizarre behavior. X(i)=X(i)*2 does not change the shape of X.

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

채택된 답변

Matt Fig
Matt Fig 2012년 9월 28일
편집: Matt Fig 2012년 9월 28일
I don't see the problem?? The code appears to behave exactly how it is programmed. The one thing I think stands out is the comment on this line:
rpm(ii)= rpm(ii)*2% multiply every element in rpm by 2
This line does not do what the comment says it does. If you want to multiply every element of rpm by 2, you do:
rpm = rpm*2; % It's called 'scalar expansion' - a good thing!
What the first bit of code does is multiply only the element at ii by 2. Thus it the comment should read:
% multiply element ii by 2
Is that your concern, or is there something else? When you say the program "doesn't work" I think you mean it "doesn't do what I expect it to do." But there is a big difference between those statements! So what do you expect it to do? (BTW, I think nothing is substantially changed by replacing each instance of 1000 by 10 so that we can keep better track of things....)

추가 답변 (1개)

owr
owr 2012년 9월 28일
The only row vector vs. column vector issues I see here (I ran the code) is between "rpm" and "count".
rpm is defined to be a column vector with this:
rpm = zeros(1000,1);
and remains a column vector throughout all your computations.
count in indirectly defined to be a row vector - indirectly because you never initialize it with anything but this:
count(1)=1;
count(1000)=1000;
When you introduce a variable like this MATLAB automatically creates it as a row vector with exactly as many elements as it needs. The first line creates a 1 x 1 row vector, the second stretches it out to a 1 x 1000 element row vector with zeros in positions 2,...,999
  댓글 수: 1
Matt Fig
Matt Fig 2012년 9월 28일
편집: Matt Fig 2012년 9월 28일
Yet this is not a problem or a conflict in any way. In the code, count and rpm do not interact... If count were defined as
count = zeros(1000,1);
before the assigning of the values at 1 and 1000, nothing else about the code would be different whatsoever.

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

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by