Why doesn't this program work?

% 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일

1 개 추천

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일

0 개 추천

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.

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

카테고리

도움말 센터File Exchange에서 Multidimensional Arrays에 대해 자세히 알아보기

제품

질문:

2012년 9월 28일

Community Treasure Hunt

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

Start Hunting!

Translated by